Показать полную графическую версию : Перевод из Tstring в UTF8
Mixalbl4
28-07-2008, 21:09
У меня проблема. Нужно перекодировадь текст из TMemo в UTF8 кодировку и потом вывести в файл. Как вывести знаю, а как перевести нет. Подскажите решение
кодируется просто: все символы с кодом < 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
pva, Всё бы хорошо. Но шаг "получаешь код каждого (только UNICODE)" не раскрыт, хотя по факту является одним из самых сложных. Ибо нужна таблица соответствия "номер в одной кодировке <-> номер в unicode". В любом случае, руками это делать не стоит, потому что для любого приличного языка существуют подходящие библиотеки.
Беглый поиск показывает, что в дельфи существуют пары функций UTF8Encode, UTF8Decode и AnsiToUtf8, Utf8ToAnsi. Пользователем дельфи не являюсь, но думаю, что в документации они достаточно подробно описаны.
а, у делфи разве не уникодовские коды? я на билдер равнялся просто, извиняюсь. Уникодовские - в смысле WideChar, та самая обычная виндовая 2-байтовая
pva, раньше точно юникодных в=строк не было (по крайней мере их поддержки в VCL). Сейчас не знаю.
В хелпе от делфи 5:
function StringToWideChar(const Source: string; Dest: PWideChar; DestSize: Integer): PWideChar;
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.