Вопрос

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

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

В чем дело?

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

Или вернитесь к HTML, экранирующему символы с диакритическими знаками (например, Ральф упоминает)

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

--джероен

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

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

Нет необходимости переводить вручную между unicdestring utf8string и unsistring widestring. Использование строк в Delphi 2009 близко к идеальному.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top