модуль перекодировки
Home Up

Модуль перекодировки

Преобразование строки из одной кодовой страницы в другую

=========================================================================
Это в модуль:

Public Const WC_COMPOSITECHECK = &H200
Public Const WC_DEFAULTCHAR = &H40
Public Const WC_DISCARDNS = &H10
Public Const WC_SEPCHARS = &H20

Public Const CP_ACP = 0
Public Const CP_OEMCP = 1
Public Const CP_MACCP = 2
Public Const CP_THREAD_ACP = 3
Public Const CP_SYMBOL = 42
Public Const CP_UTF7 = 65000
Public Const CP_UTF8 = 65001

Public Const MB_PRECOMPOSED = &H1
Public Const MB_COMPOSITE = &H2
Public Const MB_USEGLYPHCHARS = &H4
Public Const MB_ERR_INVALID_CHARS=&H8

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

Public Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, _
ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, _
ByVal lpWideCharStr As String, ByVal cchWideChar As Long) As Long

=========================================================================


'Описание вызовов и параметров

WideCharToMultiByte 'преобразует Unicode строку в символьную строку.
'Новая символьная строка не обязательно из много-символьного набора.
'(перевел как смог...)
'ПараметрОписание
CodePage 'Кодовая страница, используемая для преобразования.
'Этот параметр может иметь значение любой кодовой страницы,
'которая установленна или доступна в системе.
'Вы так же можете использовать одно из следующих значений:
CP_ACP - ANSI code page
CP_MACCP - Macintosh code page
CP_OEMCP - OEM code page
CP_SYMBOL - Symbol code page (42)
CP_THREAD_ACP
CP_UTF7
CP_UTF8

dwFlags 'Битовые флаги, определяющие обработку символов,
'которые не могут быть преобразованы. Вызов
'работает наиболее быстро если ни один из флагов не используется.
WC_NO_BEST_FIT_CHARS
WC_COMPOSITECHECK
WC_DISCARDNS
WC_SEPCHARS
WC_DEFAULTCHAR

lpWideCharStrUnicode 'строка для преобразования
cchWideChar 'Длина Unicode строки в символах, если -1 то
'предполагается что строка NULL-terminated
'и длина расчитывается автоматически
lpMultiByteStr 'Буфер в который помещается преобразованная строка.

cchMultiByte 'Длина буфера в байтах
lpDefaultChar 'Символ который будет использоватся в том случает
'если Unicode символ не может быть преобразован
'в выьранной кодовой странице.
lpUsedDefaultChar 'Флаг, показывающий был ли использован DefaultChar в преобразовании.
Return Value 'В случае успешного завершения - это длинна преобразованной
'строки, в обратном случае 0.
MultiByteToWideChar 'преобразует символьную строку в Unicode.

CodePage см. Описание WideCharToMultiByte dwFlagsВсегда будем
использовать значение MB_PRECOMPOSED lpMultiByteStrСимвольная строка
для преобразования cchMultiByteДлина символьной строки в байтах, если
строка NULL-terminated то для автоматического расчета длины строки
используйте -1. lpWideCharStrБуфер в который помещается Unicode
строка. cchWideCharДлина буфера в Unicode символах Return Value:В
случае успешного завершения - это кличество Unicode символов
записанных в буфер lpWideCharStr, в обратном случае 0.

ПРИМЕР:

Функция ConvertString преобразует строку strStc из кодовой страницы nFromCP,
в кодовую страницу nToCP, и возвращает преобразованную строку.

Public Function ConvertString(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)
ConvertString = Left(strRet, nRet)
End Function

И проблем никаких! Имеем, допустим, TextBox. В нем текст в кодировке
KOI, надо получить в Windows. Запускаешь:

TextBox = StringConvert(TextBox, 20866, 1251)

И все! 400Кб за одну секунду!


'Значения для часто используемых кодовых страниц

Central European (DOS)852
Central European Alphabet (Windows)1250
Central European Alphabet (ISO)28592
Cyrillic Alphabet (DOS)866
Cyrillic Alphabet (Windows)1251
Cyrillic Alphabet (ISO)28595
Cyrillic Alphabet (KOI8-R)20866
Ukrainian Alphabet (KOI8-RU)21866
Latin 3 Alphabet (ISO)28593
Western Alphabet1252
Baltic Alphabet (Windows)1257
Baltic Alphabet (ISO)28594
Greek Alphabet (Windows)1253
Greek Alphabet (ISO)28597
Turkish Alphabet1254
Arabic Alphabet (Windows)1256
Arabic Alphabet (ISO)28596
Hebrew (DOS)862
Hebrew Alphabet (Windows)1255
==========================================================================

Модуль и описание любезно предоставлены Ивановым Виталием.

 

 

Home ] Up ] О группе ] Статьи ] Исходники ] Орфография ] Приёмы ] Проекты ] Наша рассылка ]

Хостинг от uCoz