Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [VB6] Преобразование из ДОС-кодировки в Win, преобразование кодировок ДОС-Windows 
:(
    Опции темы
Voldemar2004
Дата 22.9.2005, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: 2
Всего: 23



Есть какая-нибудь функция преобразования из ДОС-кодировки в Windows (dos 866-> win 866). Поле в Access имеет ДОС-кодировку, мне надо преобразовать в читабельный вид.


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Akina
Дата 22.9.2005, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



Код

Declare Function CharToOem     Lib "user32" Alias "CharToOemA" _ 
   (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
Declare Function OemToChar     Lib "user32" Alias "OemToCharA" _
   (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
Declare Function CharToOemBuff Lib "user32" Alias "CharToOemBuffA" _
   (ByVal lpszSrc As String, ByVal lpszDst As String, ByVal cchDstLength As Long) As Long
Declare Function OemToCharBuff Lib "user32" Alias "OemToCharBuffA" _
   (ByVal lpszSrc As String, ByVal lpszDst As String, ByVal cchDstLength As Long) As Long

выбирай...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
quasi
Дата 15.11.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007

Репутация: нет
Всего: 0



Код

Dim l_lReturn as Long
Dim l_sSource as String 'исходный текст
Dim l_sDestination as String 'возвращаемый текст
l_lReturn = oemtochar(l_sSource, l_sDestination)

А как забирать текст из исходного файла и сохранять в файл назначения с тем же форматом в виндовой кодировке?

Это сообщение отредактировал(а) quasi - 15.11.2007, 11:09
PM MAIL   Вверх
bom
Дата 16.11.2007, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: нет
Всего: 6



Есть в VB такие функции как: input, print..., вот с их помощью и забирай.
PM MAIL   Вверх
quasi
Дата 16.11.2007, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007

Репутация: нет
Всего: 0



Как передать значение из f.ReadAll  в  l_sSource?
Код

Dim l_lReturn as Long 
Dim l_sSource as String 'исходный текст 
Dim l_sDestination as String 'возвращаемый текст 
l_lReturn = oemtochar(l_sSource, l_sDestination) 

Код

Const ForReading = 1, ForWriting = 2
   Dim fso, f 
   Set fso = CreateObject("Scripting.FileSystemObject") 
   Set f = fso.OpenTextFile("c:\testfile.txt", ForReading) 
   ReadAllTextFile =   f.ReadAll 
   f.close

Можно ли читать и писать один файл, как?
PM MAIL   Вверх
Akina
Дата 16.11.2007, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



Цитата(quasi @  16.11.2007,  03:11 Найти цитируемый пост)
Можно ли читать и писать один файл

Нежелательно. Может привести к конфликтам.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
JusTalionis
Дата 17.11.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: нет
Всего: 17



Технически - в данном случае можно, поскольку перекодировка байт-на-байт, и конфликта получиться не должно бы.
НО!
В таком исполнении исходный вариант сразу пропадает навсегда, что не есть гуд! А если Вы по ошибке запустили преобразование по тому файлу, который не надо было? - капут!..
Неет, исходник сохранять надо!
Я бы рекомендовал, как обычно, задать сначала переименование исходного файла в .bak или .old (или что там больше Вам подходит по смыслу), и затем с него писать преобразованный файл под начальным именем.

PM MAIL   Вверх
quasi
Дата 19.11.2007, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007

Репутация: нет
Всего: 0



Что тут не так?
Код

Dim l_lReturn as Long, l_sSource as String, l_sDestination as String
  Const ForReading = 1, ForWriting = 2 
   Dim fso, f 
   Set fso = CreateObject("Scripting.FileSystemObject") 
   Set f = fso.OpenTextFile("c:\print.txt", ForReading) 
   l_sSource =   f.ReadAll 
f.close 
   l_lReturn = oemtochar(l_sSource, l_sDestination) 
   Set f = fso.OpenTextFile("c:\print.txt", ForWriting, True) 
   f.write l_lReturn
'   l_sDestination = f.Write 
f.close


Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  dos_to_win.jpg 7,44 Kb
PM MAIL   Вверх
Akina
Дата 19.11.2007, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



Цитата(quasi @  19.11.2007,  03:10 Найти цитируемый пост)
Что тут не так?

Пространство под l_sDestination должно быть зарезервировано ДО вызова API-функции:

7.5: l_sDestination = Space(Len(l_sSource))


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bom
Дата 19.11.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: нет
Всего: 6



... Ну и естественно записывать в файл не число вернутое функцией, а подготовленный строковый буфер. В остальном copy\paste сработало без ошибок.
PM MAIL   Вверх
quasi
Дата 20.11.2007, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007

Репутация: нет
Всего: 0



Цитата

записывать в файл не число вернутое функцией, а подготовленный строковый буфер. 

Можно подробнее? smile 
PM MAIL   Вверх
Akina
Дата 20.11.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



10: f.write l_sDestination 

PS. Еще один вопрос без мыслей в голове - и остаток темы будете прорабатывать в Центре помощи.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
quasi
Дата 2.12.2007, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007

Репутация: нет
Всего: 0



Ткните что не так?!
Код
Dim l_lReturn, l_sSource, l_sDestination, fso, f
Function oemtochar(s)
Dim i,k
  For i=1 To Len(s) 
    k = Asc(Mid(s,i,1))  
    If (128 <= k) And (k <= 175) Then
      k=k+64
    ElseIf (224 <= k) And (k <= 239) Then
      k=k+16
    ElseIf k = 240 Then
      k=168
    ElseIf k = 241 Then
      k=184
    End If
    l_sSource=l_sSource+Chr(k) 
  Next
oemtochar=l_sSource
End Function
Const ForReading = 1, ForWriting = 2
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set f = fso.OpenTextFile("c:\print.txt", ForReading)
   l_sSource =   f.ReadAll
f.close
   l_sDestination = Space(Len(l_sSource))
   l_lReturn = oemtochar(l_sSource, l_sDestination)
   Set f = fso.OpenTextFile("c:\print.txt", ForWriting, True)
   f.write l_sDestination
f.close

PM MAIL   Вверх
bom
Дата 2.12.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: нет
Всего: 6



Держи. На следующий раз - готовь VMZ smile 
Код

Private Declare Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long

Private Sub Form_Load()
Dim str_buff As String
Open "c:\print.txt" For Binary As #1
str_buff = Space(LOF(1))
Get #1, 1, str_buff
OemToChar str_buff, str_buff
Put #1, 1, str_buff
Close #1
End Sub

PM MAIL   Вверх
quasi
Дата 3.12.2007, 02:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007

Репутация: нет
Всего: 0



bom, спасибо, но ваш примеркик на VB, а нужно на VBS. ВОт только не пойму, получается пустышка, даже не ругается что таких файлов print1.txt и print2.txt нет, хм...
Код

Dim l_lReturn, l_sSource, l_sDestination, fso, f 
Function oemtochar(s) 
Dim i,k
  For i=1 To Len(s) 
    k = Asc(Mid(s,i,1))  
    If (128 <= k) And (k <= 175) Then 
      k=k+64 
    ElseIf (224 <= k) And (k <= 239) Then 
      k=k+16 
    ElseIf k = 240 Then 
      k=168 
    ElseIf k = 241 Then 
      k=184 
    End If 
    l_sSource=l_sSource+Chr(k) 
  Next 
oemtochar=l_sSource 
Const ForReading = 1, ForWriting = 2 
   Set fso = CreateObject("Scripting.FileSystemObject") 
   Set f = fso.OpenTextFile("c:\print2.txt", ForReading) 
   l_sSource =   f.ReadAll 
f.close 
   l_sDestination = Space(Len(l_sSource)) 
   l_lReturn = oemtochar(l_sSource, l_sDestination) 
   Set f = fso.OpenTextFile("c:\print1.txt", ForWriting, True) 
   f.write l_sDestination 
f.close
End Function 

PM MAIL   Вверх
bom
Дата 3.12.2007, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: нет
Всего: 6



Получите:
Код

Function oemtochar(s) 
  For i=1 To Len(s) 
    k = Asc(Mid(s,i,1))  
    If (128 <= k) And (k <= 175) Then 
      k=k+64 
    ElseIf (224 <= k) And (k <= 239) Then 
      k=k+16 
    ElseIf k = 240 Then 
      k=168 
    ElseIf k = 241 Then 
      k=184 
    End If 
    oemtochar=oemtochar+Chr(k) 
  Next 
End Function 

Set fso = CreateObject("Scripting.FileSystemObject") 
fso.OpenTextFile("c:\print1.txt", 2, True).write oemtochar(fso.OpenTextFile("c:\print2.txt", 1).ReadAll)

PM MAIL   Вверх
Akina
Дата 3.12.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



Надоело. Переношу.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1215 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.