- Utf to windows 1251 delphi
- Utf to windows 1251 delphi
- Перекодирование Utf-8 в windows-1251
- Delphi , Синтаксис , Кодировки
- Перекодирование Utf-8 в windows-1251
- 3 варианта работы с кодировками веб-страниц в Delphi.
- 1. Delphi и Unicode
- 2. Подготовка исходных данных для работы
- 3. Массив байтов – в нормальный текст
- 3.1. Работа с TEncoding
- 3.2. Использование возможностей MLang для работы с кодовыми страницами
Utf to windows 1251 delphi
Имеется проблема: необходимо перекодировать строку в кодировке UTF-8 в Windows-1251 средствами Delphi-4. В Delphi-6 есть функция Utf8ToAnsi, которая и делает все дело, однако в Delphi-4 ее нет. В результате долгих поисков в Интернете нарыл бесплатную библиотеку DIConverters.pas (http://www.zeitungsjunge.de/delphi/converters/index.htm), которая вроде как позволяет конвертировать из UTF-8 в Unicode. Однако умения воспользоваться этой библиотекой не хватает 🙂
Если у кого есть мысли, как выполнить перекодировку UTF-8 —> Unicode —> Windows-1251, please, чиркните примерчик.
← →
dmitry501 © ( 2005-06-08 11:32 ) [1]
Zhachuk © (08.06.05 11:14)
Вот, взял из Audio Tools Library (Freeware) http://jfaul.de/atl
UTF-ANSI
function ConvertFromUTF8(const Source: string): string;
var
Iterator, SourceLength, FChar, NChar: Integer;
begin
< Convert UTF-8 string to ANSI string >
Result := «»;
Iterator := 0;
SourceLength := Length(Source);
while Iterator = $80 then
begin
Inc(Iterator);
if Iterator > SourceLength then break;
FChar := FChar and $3F;
if (FChar and $20) <> 0 then
begin
FChar := FChar and $1F;
NChar := Ord(Source[Iterator]);
if (NChar and $C0) <> $80 then break;
FChar := (FChar shl 6) or (NChar and $3F);
Inc(Iterator);
if Iterator > SourceLength then break;
end;
NChar := Ord(Source[Iterator]);
if (NChar and $C0) <> $80 then break;
Result := Result + WideChar((FChar shl 6) or (NChar and $3F));
end
else
Result := Result + WideChar(FChar);
end;
end;
function DecodeUTF8(const Source: string): WideString;
var
Index, SourceLength, FChar, NChar: Cardinal;
begin
< Convert UTF-8 to unicode >
Result := «»;
Index := 0;
SourceLength := Length(Source);
while Index = $80 then
begin
Inc(Index);
if Index > SourceLength then exit;
FChar := FChar and $3F;
if (FChar and $20) <> 0 then
begin
FChar := FChar and $1F;
NChar := Ord(Source[Index]);
if (NChar and $C0) <> $80 then exit;
FChar := (FChar shl 6) or (NChar and $3F);
Inc(Index);
if Index > SourceLength then exit;
end;
NChar := Ord(Source[Index]);
if (NChar and $C0) <> $80 then exit;
Result := Result + WideChar((FChar shl 6) or (NChar and $3F));
end
else
Result := Result + WideChar(FChar);
end;
end;
function EncodeUTF8(const Source: WideString): string;
var
Index, SourceLength, CChar: Cardinal;
begin
< Convert unicode to UTF-8 >
Result := «»;
Index := 0;
SourceLength := Length(Source);
while Index $7FF then
begin
Result := Result + Char($E0 or (CChar shr 12));
Result := Result + Char($80 or ((CChar shr 6) and $3F));
Result := Result + Char($80 or (CChar and $3F));
end
else
begin
Result := Result + Char($C0 or (CChar shr 6));
Result := Result + Char($80 or (CChar and $3F));
end;
end;
end;
Utf to windows 1251 delphi
Подскажите пожалуста,как преобразовать строку из UTF-8 в WIN-1251
← →
umbra © ( 2006-01-26 14:52 ) [1]
← →
Андр ( 2006-01-26 15:14 ) [2]
А в чем возвращается значение после этой функции? в widestring?
← →
umbra © ( 2006-01-26 15:18 ) [3]
в string . и в справке об этом написано
← →
Андр ( 2006-01-26 15:22 ) [4]
Да,Вы правы,написано.
Call Utf8ToAnsi to convert a UTF-8 string to Ansi. S is a string encoded in UTF-8. Utf8ToAnsi returns the corresponding string that uses the Ansi character set.
Только вот такая проблема:
output:=Utf8ToAnsi(Edit1.Text);
Memo2.Lines.Add(output);
не работает.Не могли бы обьяснить почему?
если можно, скажите поподробнее, что значит «не работает». Первое, что приходит в голову — в Edit1.Text находится не UTF8-строка
← →
Андр ( 2006-01-26 17:45 ) [6]
Уже разобрался сам.Дело в том что в кодировке utf8 слово кончается знаком ¶.Я копировал текст из IE ,а он автоматически убирает данный знак.
Все равно спасибо Вам за то что выслушали меня.
Вот рабочий вариант,если кому то надо:
Edit1.Text:=UTF8ToAnsi(Edit2.text);
Перекодирование Utf-8 в windows-1251
Delphi , Синтаксис , Кодировки
Перекодирование Utf-8 в windows-1251
Данная функция будет полезна в случае если, по тем или иным причинам, нельзя применять, стандартную функцию UTF8Decode, например если программа будет запускаться под wine в UNIX-подобных системах.
Utf2WinTable : array [0..65, 0..1] of string = (
(#208#144,#192), (#208#145,#193), (#208#146,#194),
(#208#147,#195), (#208#148,#196), (#208#149,#197),
(#208#129,#168), (#208#150,#198), (#208#151,#199),
(#208#152,#200), (#208#153,#201), (#208#154,#202),
(#208#155,#203), (#208#156,#204), (#208#157,#205),
(#208#158,#206), (#208#159,#207), (#208#160,#208),
(#208#161,#209), (#208#162,#210), (#208#163,#211),
(#208#164,#212), (#208#165,#213), (#208#166,#214),
(#208#167,#215), (#208#168,#216), (#208#169,#217),
(#208#170,#218), (#208#171,#219), (#208#172,#220),
(#208#173,#221), (#208#174,#222), (#208#175,#223),
(#208#176,#224), (#208#177,#225), (#208#178,#226),
(#208#179,#227), (#208#180,#228), (#208#181,#229),
(#209#145,#184), (#208#182,#230), (#208#183,#231),
(#208#184,#232), (#208#185,#233), (#208#186,#234),
(#208#187,#235), (#208#188,#236), (#208#189,#237),
(#208#190,#238), (#208#191,#239), (#209#128,#240),
(#209#129,#241), (#209#130,#242), (#209#131,#243),
(#209#132,#244), (#209#133,#245), (#209#134,#246),
(#209#135,#247), (#209#136,#248), (#209#137,#249),
(#209#138,#250), (#209#139,#251), (#209#140,#252),
(#209#141,#253), (#209#142,#254), (#209#143,#255) );
function Utf8ToWin(s : string) : string;
var i : integer;
res :string;
begin
res:=s;
for I := 0 to 65 do
if pos(Utf2WinTable[i,0],res)>0
then res := StringReplace(res, Utf2WinTable[i,0], Utf2WinTable[i,1], [rfReplaceAll]);
Статья Перекодирование Utf-8 в windows-1251 раздела Синтаксис Кодировки может быть полезна для разработчиков на Delphi и FreePascal.
3 варианта работы с кодировками веб-страниц в Delphi.
Сколько постов написано в блогах, сколько вопросов задано на форумах о кодировках и ещё большее количество подобных вопросов осталось не отвеченными или ответом было что-то наподобие “Поиском пользовались?” или “Сто раз обсуждалось. ”. Честно говоря, никогда не понимал таких “ответчиков”, ИМХО не хочешь отвечать – лучше жуй и молчи, ответят те, кто захочет.
Понятное дело, что обучать иногда приходится не только с помощью пряника, но и с помощью кнута, но, раз уж такие вопросы всё время всплывают, следовательно они остаются актуальными.
Сегодня я попробую рассказать Вам всё, что мне известно о работе с кодировками в тексте. Вполне возможно, что эта статья поможет Вам при разработке своих проектов в Delphi да и у меня уже пару раз возникало желание немного систематизировать ту информацию. которая накопилась за время существования блога.
1. Delphi и Unicode
Если говорить о работе с Unicode в Delphi, то начать стоит с того, что полноценная поддержка unicode в Delphi стала возможна лишь после выхода Delphi 2009. Такое событие не могло пройти незамеченным, так как благодаря поддержке Unicode и, соответственно, для облегчения работы с кодировками текста в Delphi были реализованы новые возможности, методы, типы данных, о которых написано большое количество статей. На мой взгляд одной из лучших публикаций на эту темя является цикл из трех статей “Delphi и кодировка Unicode” где достаточно чётко и доступно рассказано о нововведениях Delphi 2009 для работы с unicod’ом. Думаю, что нет смысла подробно останавливаться на всех новшествах при наличии ссылки на целых три статьи на эту тему. Остается только упомянуть о том, с чем мы сегодня будем работать для представления веб-страницы в нормальном читаемом виде.
Для первого способа работы с кодировкой мы воспользуемся:
- Класс TEncoding, который и дает нам возможность без лишних хлопот работать с кодировками
- Тип данных TBytes – массива байтов строк
- RawByteString – тип для передачи строковых данных для любой кодовой страницы без каких-либо преобразований последней
В одной из статей блога рассматривалась работа с MLang и сегодня, в качестве второго способа, я продемонстрирую Вам пример её применения при работе с кодировками.
Ну и в качестве третьего способа работы с кодировками, воспользуемся “штатными” методами модуля system. Все три варианта работы с кодировками приведут к одному и тому же результату – текст веб-страницы будет читаемым, без “кракозябров” и вопросительных знаков. Какой способ лучше – решать только Вам.
2. Подготовка исходных данных для работы
Прежде, чем начать что-то кодировать и перекодировать, необходимо это “что-то” получить. В нашем случае – текст веб-страницы. Чтобы не залезать слишком глубоко в вопросы, касающиеся новых типов данных будем сохранять все данные из Сети не в строки или TStringList’ы, как мы к этому привыкли, а воспользуемся типом TBytes.
Используя Synapse исходник любой страницы можно получить, например так:
Теперь, получив данные (свойство Document:TMemoryStream) скопируем эти данные в массив байтов строки TBytes, например так (способ достаточно медленный, приведен исключительно для примера):
Первый этап подготовки можно считать законченным – у нас есть массив байтов строки, которые необходимо представить в виде текста в правильной кодировке. А как узнать, что наш массив TBytes надо перевести в новую “правильную” кодировку? Естественно узнать в какой кодировке была исходная страница. Здесь можно пойти двумя путями:
1. Узнать кодировку из мета-тегов. Обычно кодировка страницы описывается мета-тегом следующего содержания:
. Пример того как узнать кодировку из мета-тегов страницы Вы можете посмотреть в модуле HtmlCPConvert, который я выкладывал в блоге, когда рассматривал работу с MLang.
2. Узнать кодировку текста из заголовков сервера. Если рассматривать этот пример, используя для работу с HTTP
Так как в заголовке может отсутствовать сведения о кодировке, то переменная DefCharset должна содержать имя какой-либо дефолтной кодовой страницы, например windows-1251.
Теперь у нас есть все исходные данные:
1. Массив байтов строки B:TBytes;
2. Сведения о кодировке.
Приступим к преобразованию байтов в читабельный текст.
3. Массив байтов – в нормальный текст
3.1. Работа с TEncoding
Разработчики Delphi предусмотрели использование двух взаимопротивоположных метода:
- function BytesOf(const Val: RawByteString): TBytes; – получение байтов из строки
- function StringOf(const Bytes: TBytes): UnicodeString; – получение строки из массива байтов
Пусть Вас не пугает то, что StringOf возвращает UnicodeString, т.к., начиная с Delphi 2009
Теперь, что касается непосредственно работы с TEncoding. Во-первых, от нас не требуется создавать отдельный экземпляр класса, наподобие такого:
Во-вторых, с помощью TEncoding мы можем менять кодовую страницу не преобразовывая массив байтов в строку. Для этого класс содержит следующие классовые методы:
Одним из этих методов мы и воспользуемся. Для того, чтобы продемонстрировать работу с TEncoding попробуем получить текст прямо из этого блога. Кодировка UTF-8, именно она наиболее часто является “проблемной” и возвращает в TMemo или ещё куда-либо “кракозябры”.
Создадим простое приложение как показано на рисунке:
В ComboBox сразу занесем все варианты работы с текстом:
- Без преобразования
- TEncoding (модуль SysUtils)
- MLang
- Utf8ToAnsi (модуль System)
По нажатию кнопки TButton будем грузить страницу в массив байтов и, зависимости от выбранного варианта работы с текстом, преобразовывать массив в строку и выводить в Memo. Для первого варианта (без преобразования) код может быть следующий:
Запускаем приложение и видим:
Как и ожидалось – вместо русских букв кракозябры. Преобразуем их с помощью классового метода TEncoding.Convert:
Здесь следует отметить, что TEncoding.GetEncoding(1251) возвращает кодовую страницу кириллического текста. Если необходимо получить другую кодовую страницу, то можете либо воспользоваться классовыми свойствами TEncoding либо определить кодовую страницу как я, используя данные с MSDN о доступных в Windows кодовых страницах.
Проверим, что получилось в итоге. Грузим ту же самую страницу:
Как видите – кракозябры преобразовались в нормальный русский текст.
Какие плюсы дает нам использование TEncoding? Думаю, что ответ вполне очевиден – у нас появляется под рукой инструмент, позволяющий перекодировать строки из любых кодировок в любые, т.е. фактически возможности работы с текстом ограничиваются количеством доступных в Windows кодовых страниц, а их по данным MSDN 152 штуки. Прикиньте сколько вариантов получится, если в Convert используется пара кодовых страниц. Много :).
Но, наряду с таким большим и жирным плюсом существует и минус – TEncoding есть только в версиях Delphi 2009 и выше, что исключает его использование в более ранних версиях. Как быть?
Если хотите получить не менее впечатляющие возможности работы с кодировками – используйте возможности MLang. Вот как раз и пример его использования.
3.2. Использование возможностей MLang для работы с кодовыми страницами
Позволю себе ещё раз напомнить, что скачать всё необходимое для реализации возможностей MLang Вы можете с этой страницы или, перейдя по этой ссылке. В архиве содержатся всего два модуля: MLang.pas и HtmlCPConvert.pas. Подключаем оба модуля к проекту и для получения читабельного текста пишем:
RawHTMLToHTML из модуля HtmlCPConvert переводит текст в кодировку windows-1251. Также есть и обратный метод для перевода текста в RawByteString и называется этот метод HTMLToRawHTML.
Результат преобразования текста с помощью MLang абсолютно идентичен предыдущему варианту:
Если Вам необходимо работать со множеством кодировок, как при использовании TEncoding, то придётся самостоятельно немного доработать модуль HtmlCPConvert. В целом возможности TEncoding и MLang вполне сопоставимы.
И, наконец, третий вариант – использование методов модуля System.pas.