Кодировка файла

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
rooty
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 30.07.2008 (Ср) 14:11

Кодировка файла

Сообщение rooty » 29.10.2008 (Ср) 16:20

Запустил в файле поиск слова, а он его не находит..
Долго думал, в чем проблема - оказалось, что файл сохранен в кодировке UTF-8. Если файл в ANSI - то никаких проблем нет.
Файл руками пересохранить не могу, т.к. качаю его из интернета программой.

Вопрос:
Как программно пересохранить файл из UTF-8 в ANSI?

Если можно, подскажите прямо кодом.. нашел пару примеров в интернете, но так и не смог разобраться :(

Спасибо.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Кодировка файла

Сообщение alibek » 29.10.2008 (Ср) 16:50

Используй заклинание MultiByteToWideChar.
Lasciate ogni speranza, voi ch'entrate.

rooty
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 30.07.2008 (Ср) 14:11

Re: Кодировка файла

Сообщение rooty » 29.10.2008 (Ср) 18:20

Спасибо..
Только очень большая просьба написать кодом. Я не понимаю, как использовать "заклинание"..

Например:
Помести в модуль
Код: Выделить всё
Declare Function MultiByteToWideChar& Lib "kernel32" (ByVal CodePage As Long, _
ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As _
Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long)

Declare Function WideCharToMultiByte& Lib "kernel32" (ByVal CodePage As Long, _
ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, _
ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpDefaultChar _
As String, ByVal lpUsedDefaultChar As Long)

' MBCS and Unicode Translation Flags.

Public Const MB_PRECOMPOSED = &H1 ' use precomposed chars
Public Const MB_COMPOSITE = &H2 ' use composite chars
Public Const MB_USEGLYPHCHARS = &H4 ' use glyph chars, not ctrl chars

Public Function Convert(ByVal strSrc As String, ByVal nFromCP As Long, ByVal nToCP As Long) As String
Dim nLen As Long
Dim strDst As String
Dim strRet As String
Dim nRet As Long
nLen = Len(strSrc)
strDst = String(nLen * 2, Chr(0))
strRet = String(nLen * 2, Chr(0))
nRet = MultiByteToWideChar(nFromCP, MB_PRECOMPOSED, strSrc, nLen, strDst, nLen)
nRet = WideCharToMultiByte(nToCP, 0, strDst, nRet, strRet, nLen * 2, ByVal 0, 0)
Convert = Left(strRet, nRet)
End Function


А в нужном месте программы для переменной используй
Код: Выделить всё
b$ = Convert(a$, 1200, 866)


Только один вопрос: как сделать, чтобы это все работало (в таком виде вылетает ошибкой) и какие цифры использовать в (a$, 1200, 866) чтобы сконвертировать строку из UTF-8 в ANCI ??

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Кодировка файла

Сообщение alibek » 30.10.2008 (Чт) 11:29

Лучше так:
Код: Выделить всё
Public Enum NlsCodePages
  CP_ACP = 0&        ' default to ANSI code page
  CP_OEMCP = 1&      ' default to OEM  code page
  CP_MACCP = 2&      ' default to MAC  code page
  CP_THREAD_ACP = 3& ' current thread's ANSI code page
  CP_SYMBOL = 42&    ' SYMBOL translations
  CP_UTF7 = 65000    ' UTF-7 translation
  CP_UTF8 = 65001    ' UTF-8 translation
End Enum

Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As NlsCodePages, ByVal dwFlags As Long, ByRef lpMultiByteStr As Any, ByVal cbMultiByte As Long, ByRef lpWideCharStr As Any, ByVal cchWideChar As Long) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As NlsCodePages, ByVal dwFlags As Long, ByRef lpWideCharStr As Any, ByVal cchWideChar As Long, ByRef lpMultiByteStr As Any, ByVal cbMultiByte As Long, ByRef lpDefaultChar As Any, ByVal lpUsedDefaultChar As Long) As Long

Private Const MB_PRECOMPOSED = &H1&   ' use precomposed chars
Private Const MB_COMPOSITE = &H2&     ' use composite chars
Private Const MB_USEGLYPHCHARS = &H4& ' use glyph chars, not ctrl chars

Public Function Convert(Data() As Byte, ByVal FromCodePage As NlsCodePages, ByVal ToCodePage As NlsCodePages) As Byte()
Dim buff() As Byte, res() As Byte, N As Long, L As Long, ret As Long
L = UBound(Data) - LBound(Data) + 1
N = MultiByteToWideChar(FromCodePage, 0&, Data(0), L, ByVal 0&, 0&)
ReDim buff(0 To N * 2 - 1)
ret = MultiByteToWideChar(FromCodePage, 0&, Data(0), L, buff(0), N)
L = WideCharToMultiByte(ToCodePage, 0&, buff(0), N, ByVal 0&, 0&, ByVal 0&, 0&)
ReDim res(0 To L - 1)
ret = WideCharToMultiByte(ToCodePage, 0&, buff(0), N, res(0), L, ByVal 0&, 0&)
Convert = res
End Function


Использовать так: res() = Convert(src(), CP_UTF8, CP_ACP)
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 52

    TopList