2009-09-25 1 views
1

Я использую Unicode SynEdit, который (в теории) имеет базовое определение кодировки файлов/потоков. Он работал нормально, пока я не попытался открыть файл, который был сгенерирован моим PHP-скриптом. Файл, о котором я говорю, обнаружен UniSynEdit как utf8 без спецификации. К сожалению, он не открывается - загруженная строка пуста. Я отлаживал его, и кажется, что проблема заключается в функции Utf8Decode, которая по какой-то причине не работает и возвращает пустую строку. Я также проверил файл с шестнадцатеричным редактором, и это правда: у него нет спецификации, все нормальные символы закодированы с использованием одного байта, в то время как некоторые латинские буквы, которые у меня были в файле (например, «ł»), являются двухбайтовыми. ..Delphi, обнаружение набора символов ([Uni] SynEdit) - проблема с Utf8Decode

Что может быть неправильным, и как я могу предотвратить это? Я считаю, что неправильная кодировка загружена лучше, чем никакой файл вообще ...

+0

В какой версии Delphi вы работаете? –

+0

Я забыл написать ... Delphi 7. – migajek

+0

Что происходит, когда есть спецификация? –

ответ

3

Если вы действительно хотите загрузить файлы, которые неправильно кодируются в кодировке UTF-8, вам необходимо использовать функцию, которая не возвращает пустой результат для строка, содержащая неверные последовательности байтов, но вместо этого заменяет их заменяющим символом. См. Раздел Wikipedia entry on UTF-8, в частности раздел «Неверные последовательности байтов».

К сожалению, в Delphi 2009 (там нет Delphi 7) UTF8Decode() вызывает внутреннюю ошибку MultibyteToWideChar(CP_UTF8, ...), которая возвращает ошибку при неправильных байтовых последовательностях.

Что вам нужно сделать, так это использовать альтернативную функцию кодирования. Возможно, что-то есть в одной из сторонних библиотек Delphi, которые имеют свои собственные функции декодирования. Возможно, вы могли бы использовать одну из связанных библиотек here. Если все остальное не удается, вы можете написать свой собственный, возможно, на основе this code из консорциума Unicode.

+0

BTW: Если вы даже не указали * ваш PHP-скрипт для создания файла UTF-8, подумайте об этом. Он должен и, желательно, действительный UTF-8 :-) – mghie

+0

это не пункт :) на самом деле, благодаря тому, что в какой-то момент я обнаружил, что мое приложение терпит неудачу, я был уверен, что он обрабатывает все ** действительные ** файлы. и это так. Но у меня не было возможности снова проверить те недопустимые;) – migajek

+0

Спасибо, похоже, что использование UTF8StringToWideString из cUnicodeCodecs (Delphi Fundamentals) отлично работает:] – migajek