FreeBasic
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

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

Участников: 2

Перейти вниз

Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251 Empty Как сконвертировать 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

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

Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251 Empty 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

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

Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251 Empty 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

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

Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251 Empty 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

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

Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251 Empty 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

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

Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251 Empty 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

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

Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251 Empty 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

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

Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251 Empty 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

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

Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251 Empty 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

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

Как сконвертировать Unicode-строку с символами русского алфавита в строку ANSI-1251 Empty 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

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

Вернуться к началу

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

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