Delphi 2009 проблема с юникодом + анси
-
05-07-2019 - |
Вопрос
Я портирую приложение 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 близко к идеальному.