2009-07-29 3 views
1

Я портирую приложение isapi (pageproducers) из delphi 7 в delphi 2009, страницы основаны на html-файлах в UTF8.delphi 2009 unicode + ansi problem

Все идет хорошо, за исключением случаев, когда Onhtmltag запущен, и я заменяю прозрачный тег любым значением специальными символами, такими как акцентированные символы (áé ...) Эти символы заменяются на выходе символом..

Что случилось?

ответ

4

Как часть процедуры отладки, вы должны выяснить, какие байтовые значения, полученные браузером для символа вопросительного знака.

Как вы должны знать, строковый тип Delphi 2009 - это Unicode, тогда как все предыдущие версии были ANSI. Delphi 7 представила тип Utf8String, но Delphi 2009 сделал этот тип особенным. Если вы не используете этот тип для хранения строк, которые кодируются как UTF-8, вам следует начать делать это. Значения, хранящиеся в Utf8String, переменные будут автоматически преобразованы в значения UnicodeString при назначении друг другу.

Если вы сохраняете свои строки в кодировке UTF-8 в обычных переменных AnsiString, они будут преобразованы в Юникод, используя страницу системного кода по умолчанию, если вы назначили их UnicodeString. Это не то, что вы хотите.

Если вы назначаете литералы, кодированные UTF-8, переменными типа string, остановите это. Этот тип ожидает, что его значения будут закодированы как UTF-16, как всегда, как WideString.

Если вы загружаете свои файлы в потомок TStrings с помощью LoadFromFile, вам необходимо начать использовать второй параметр этого метода, который сообщает ему, какую кодировку использовать. Файлы с кодировкой UTF-8 должны использовать TEncoding.UTF8. По умолчанию используется TEncoding.Unicode, который является малоподвижным UTF-16.

+0

+1, хотел бы я дать +2. Компактный и информативный. – Argalatyr

+0

Спасибо, Роб, последний абзац - это точно решение моей проблемы. –

+0

Собственно, именно Delphi 6 представил UTF8String. –

0

Это, вероятно, проблема кодирования символов.

В Delphi IDE обычно используется Windows-1252 или UTF-16 для кодирования исходного кода. HTML часто использует UTF-8.

Возможно, вам понадобится транслитерация между этими кодировками. Для этого вам нужно выяснить, какие именно кодировки используются (например, Rob).

Или вернуться к HTML спасаясь символы с диакритическими знаками (например, Ralph упоминает)

Вы можете разместить небольшое приложение, которое показывает проблему? (вы можете направить меня по электронной почте, обо всем, что имеет jeroen в имени пользователя, и pluimers.com в доменное имя прибудет в мой почтовый ящик).

--jeroen

0

Спасибо за вашу помощь, после некоторых испытаний проблемы было очень простыми (или глупыми также)

response.contenttype := 'text/html charset=UTF-8' 

Нет необходимости переводить вручную между UnicodeString UTF8String AnsiString WideString. Использование строк в Delphi 2009 почти идеально.

Смежные вопросы