Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251

Предыдущая тема Следующая тема Перейти вниз

Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251

Сообщение  Black Doomer в Пн Янв 21, 2013 4:34 pm

Суть такова.
У нас есть WString Ptr, указывающий на Unicode-строку с символами русского алфавита.
Как сконвертировать её в строку типа ZString в кодировке ANSI-1251 (вариант кодировки ANSI для русского языка) и вернуть указатель на неё типа ZString Ptr?

Заранее благодарен.

Black Doomer

Сообщения : 27
Дата регистрации : 2011-08-23

Посмотреть профиль http://doom2d.org/forum/viewforum.php?f=19

Вернуться к началу Перейти вниз

Re: Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251

Сообщение  trew в Вт Янв 22, 2013 7:58 am

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

Сообщение  Black Doomer в Вт Янв 22, 2013 4:34 pm

WinAPI, не?) Спасибо, попробую.)

Black Doomer

Сообщения : 27
Дата регистрации : 2011-08-23

Посмотреть профиль http://doom2d.org/forum/viewforum.php?f=19

Вернуться к началу Перейти вниз

Re: Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251

Сообщение  Black Doomer в Ср Янв 23, 2013 12:31 pm

Попробовал, но пока в обратную сторону, из ANSI в Unicode. Работает, но результат выдаёт в кодировке UTF-16LE, а нужен UTF-8 без BOM.
Можно как-нибудь сделать, чтобы именно в него конвертировалось?

Black Doomer

Сообщения : 27
Дата регистрации : 2011-08-23

Посмотреть профиль http://doom2d.org/forum/viewforum.php?f=19

Вернуться к началу Перейти вниз

Re: Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251

Сообщение  trew в Ср Янв 23, 2013 2:15 pm

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

Сообщение  Black Doomer в Ср Янв 23, 2013 3:35 pm

Хорошо, спасибо. А какой тип указателя для второго буфера тогда? WString Ptr?
Просто следующий код у меня не работает, а что именно я сделал неправильно, не вижу.
Код пишется для 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

Black Doomer

Сообщения : 27
Дата регистрации : 2011-08-23

Посмотреть профиль http://doom2d.org/forum/viewforum.php?f=19

Вернуться к началу Перейти вниз

Re: Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251

Сообщение  trew в Ср Янв 23, 2013 5:52 pm

Код:
#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

Сообщение  Black Doomer в Ср Янв 23, 2013 6:11 pm

trew, похоже работает, спасибо! Вы меня уже в который раз выручаете.)
Есть только один вопрос. Почему MultiByteToWideChar(CP_ACP, 0, ProcStr, -1, 0, 0) вернул размер буфера, подходящий для ANSI-строки, но неприемлемый для UTF-16LE? Или это я чего-то не понял?

Black Doomer

Сообщения : 27
Дата регистрации : 2011-08-23

Посмотреть профиль http://doom2d.org/forum/viewforum.php?f=19

Вернуться к началу Перейти вниз

Re: Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251

Сообщение  trew в Ср Янв 23, 2013 6:36 pm

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

Сообщение  Black Doomer в Ср Янв 23, 2013 6:39 pm

trew, большое спасибо ещё раз.)

Black Doomer

Сообщения : 27
Дата регистрации : 2011-08-23

Посмотреть профиль http://doom2d.org/forum/viewforum.php?f=19

Вернуться к началу Перейти вниз

Re: Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения