Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Перевод из Tstring в UTF8 (http://forum.oszone.net/showthread.php?t=112482)

Mixalbl4 28-07-2008 21:09 863068

Перевод из Tstring в UTF8
 
У меня проблема. Нужно перекодировадь текст из TMemo в UTF8 кодировку и потом вывести в файл. Как вывести знаю, а как перевести нет. Подскажите решение

pva 29-07-2008 08:34 863309

кодируется просто: все символы с кодом < 128 остаются сами собой. С остальными поступают так:
1. разбивают символы на биты: xxxxxxxx xxxxxxxx
2. начиная с младшего бита, начинают рассовывать по 6 бит в байт, причём старшие 2 бита 10: ... 10xxxxxxx 10xxxxxxx
3. в самом первом байте в начале идёт столько единичек, сколько байт закодируют один символ, а потом бит 0, например:
2 байта: 110xxxxx 10xxxxxx
3 байта: 1110xxxx 10xxxxxx 10xxxxxx
4 байта: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
4. хотя можно один и тот же символ закодировать хоть каким количеством байт (за счёт нулей в старших битах), рекомендуется считать последовательности с избыточным кодированием ошибочными, например символ с кодом 511:
511 = 00000001 11111111
2 байта: 11000111 10111111
3 байта: 11100000 10000111 10111111 - неверный символ, т.к. можно закодировать 2-мя байтами

Таким образом, перебираешь поочереди все символы в своём тексте, получаешь код каждого (только UNICODE). Определяешь, сколько нужно байт на кодировку символа и распихиваешь его биты по байтам. Если хочешь проверить правильность текста, открой потом блокнотом в windows XP.
И ещё: при сохранении файла принято указывать в каком порядке идут байты в многобайтовой кодировке. Для этоко в начале файла ставится символ FF FE (65534), в utf8 он кодируется последовательностью EF BB BF

ivank 29-07-2008 20:08 863876

pva, Всё бы хорошо. Но шаг "получаешь код каждого (только UNICODE)" не раскрыт, хотя по факту является одним из самых сложных. Ибо нужна таблица соответствия "номер в одной кодировке <-> номер в unicode". В любом случае, руками это делать не стоит, потому что для любого приличного языка существуют подходящие библиотеки.

Беглый поиск показывает, что в дельфи существуют пары функций UTF8Encode, UTF8Decode и AnsiToUtf8, Utf8ToAnsi. Пользователем дельфи не являюсь, но думаю, что в документации они достаточно подробно описаны.

pva 30-07-2008 14:11 864391

а, у делфи разве не уникодовские коды? я на билдер равнялся просто, извиняюсь. Уникодовские - в смысле WideChar, та самая обычная виндовая 2-байтовая

ivank 30-07-2008 14:19 864400

pva, раньше точно юникодных в=строк не было (по крайней мере их поддержки в VCL). Сейчас не знаю.

pva 30-07-2008 14:25 864407

В хелпе от делфи 5:
function StringToWideChar(const Source: string; Dest: PWideChar; DestSize: Integer): PWideChar;


Время: 11:31.

Время: 11:31.
© OSzone.net 2001-