Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251
Участников: 2
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251
Суть такова.
У нас есть WString Ptr, указывающий на Unicode-строку с символами русского алфавита.
Как сконвертировать её в строку типа ZString в кодировке ANSI-1251 (вариант кодировки ANSI для русского языка) и вернуть указатель на неё типа ZString Ptr?
Заранее благодарен.
У нас есть WString Ptr, указывающий на Unicode-строку с символами русского алфавита.
Как сконвертировать её в строку типа ZString в кодировке ANSI-1251 (вариант кодировки ANSI для русского языка) и вернуть указатель на неё типа ZString Ptr?
Заранее благодарен.
Re: Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251
Black Doomer пишет:Суть такова.
У нас есть WString Ptr, указывающий на Unicode-строку с символами русского алфавита.
Как сконвертировать её в строку типа ZString в кодировке ANSI-1251 (вариант кодировки ANSI для русского языка) и вернуть указатель на неё типа ZString Ptr?
Заранее благодарен.
Попробуй это:
- Код:
Function UTFTOASCII(ByVal text As WString Ptr) As ZString Ptr
Var blen = WideCharToMultiByte (CP_ACP,0,text,-1,0,0,0,0)
Dim As ZString ptr wbuf
wbuf= allocate( blen )
WideCharToMultiByte (CP_ACP,0,text,-1,Cast(LPSTR,wbuf),blen,0,0)
Return wbuf
End Function
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251
WinAPI, не?) Спасибо, попробую.)
Re: Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251
Попробовал, но пока в обратную сторону, из ANSI в Unicode. Работает, но результат выдаёт в кодировке UTF-16LE, а нужен UTF-8 без BOM.
Можно как-нибудь сделать, чтобы именно в него конвертировалось?
Можно как-нибудь сделать, чтобы именно в него конвертировалось?
Re: Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251
Black Doomer пишет:Попробовал, но пока в обратную сторону, из ANSI в Unicode. Работает, но результат выдаёт в кодировке UTF-16LE, а нужен UTF-8 без BOM.
Можно как-нибудь сделать, чтобы именно в него конвертировалось?
Можно. Конвертишь сначала в UTF-16:
MultiByteToWideChar(CP_ACP...
а потом в строковое представление UTF-8:
WideCharToMultiByte(CP_UTF8...
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251
Хорошо, спасибо. А какой тип указателя для второго буфера тогда? WString Ptr?
Просто следующий код у меня не работает, а что именно я сделал неправильно, не вижу.
Код пишется для DLL.
Просто следующий код у меня не работает, а что именно я сделал неправильно, не вижу.
Код пишется для DLL.
- Код:
#define GME cdecl Alias
#include once "windows.bi"
Dim Shared AS WString Ptr WStrResult
Declare Function unicode GME "unicode" (ProcStr AS ZString Ptr) AS WString Ptr
Function unicode GME "unicode" (ProcStr AS ZString Ptr) AS WString Ptr Export
Var OutLen = MultiByteToWideChar(CP_ACP, 0, ProcStr, -1, 0, 0)
Dim AS WString Ptr WStrTemp = CAllocate(OutLen)
MultiByteToWideChar(CP_ACP, 0, ProcStr, -1, WStrTemp, OutLen)
OutLen = WideCharToMultiByte(CP_UTF8, 0, WStrTemp, -1, 0, 0, 0, 0)
WStrResult = Reallocate(WStrResult, OutLen)
WideCharToMultiByte(CP_UTF8, 0, WStrTemp, -1, CPtr(LPSTR, WStrResult), OutLen, 0, 0)
Deallocate(WStrTemp)
Return WStrResult
End Function
Re: Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251
- Код:
#define GME cdecl Alias
#include once "windows.bi"
Dim Shared AS ZString Ptr WStrResult
Declare Function unicode GME "unicode" (ProcStr AS ZString Ptr) AS ZString Ptr
Function unicode GME "unicode" (ProcStr AS ZString Ptr) AS ZString Ptr Export
Var OutLen = MultiByteToWideChar(CP_ACP, 0, ProcStr, -1, 0, 0)
Dim AS WString Ptr WStrTemp = CAllocate(OutLen*2+2)
MultiByteToWideChar(CP_ACP, 0, ProcStr, -1, WStrTemp, OutLen)
OutLen = WideCharToMultiByte(CP_UTF8, 0, WStrTemp, -1, 0, 0, 0, 0)
WStrResult = Reallocate(WStrResult, OutLen)
WideCharToMultiByte(CP_UTF8, 0, WStrTemp, -1, CPtr(LPSTR, WStrResult), OutLen, 0, 0)
Deallocate(WStrTemp)
Return WStrResult
End Function
? *unicode(@"Hello Мир") ' Буфер содержит кодированную инфу в UTF8
Sleep
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251
trew, похоже работает, спасибо! Вы меня уже в который раз выручаете.)
Есть только один вопрос. Почему MultiByteToWideChar(CP_ACP, 0, ProcStr, -1, 0, 0) вернул размер буфера, подходящий для ANSI-строки, но неприемлемый для UTF-16LE? Или это я чего-то не понял?
Есть только один вопрос. Почему MultiByteToWideChar(CP_ACP, 0, ProcStr, -1, 0, 0) вернул размер буфера, подходящий для ANSI-строки, но неприемлемый для UTF-16LE? Или это я чего-то не понял?
Re: Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251
Black Doomer пишет:trew, похоже работает, спасибо! Вы меня уже в который раз выручаете.)
Есть только один вопрос. Почему MultiByteToWideChar(CP_ACP, 0, ProcStr, -1, 0, 0) вернул размер буфера, подходящий для ANSI-строки, но неприемлемый для UTF-16LE? Или это я чего-то не понял?
MultiByteToWideChar судя по всему возвращает кол-во двухбайтовых символов. Поэтому при выделении памяти для буфера размер удваивается в параметре Callocate , ну и на всякий прибавил пару байтов.
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251
trew, большое спасибо ещё раз.)
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|