Какие общие кодировки символов должны поддерживаться текстовым редактором?

У меня есть текстовый редактор, который может загружать файлы ASCII и Unicode. Он автоматически определяет кодировку, ища спецификацию в начале файла и / или ища в первых 256 байтах символы> 0x7f.

Какие еще кодировки следует поддерживать и какие характеристики позволят легко определить эту кодировку автоматически?


person Nathan Osman    schedule 20.01.2010    source источник


Ответы (6)


Однозначно UTF-8. См. http://www.joelonsoftware.com/articles/Unicode.html.

Насколько мне известно, нет гарантированного способа обнаружить это автоматически (хотя вероятность ошибочного диагноза может быть уменьшена до очень небольшой величины путем сканирования).

person Steve Emmerson    schedule 20.01.2010

Я не знаю о кодировках, но убедитесь, что он поддерживает несколько различных стандартов окончания строк! (\ п против \ г \ п)

Если вы еще не заходили в блог Мича Каплана, я предлагаю сделать это: http://blogs.msdn.com/michkap/

В частности, может быть полезна эта статья: http://www.siao2.com/2007/04/22/2239345.aspx

person mletterle    schedule 20.01.2010
comment
Он поддерживает оба, не волнуйтесь. - person Nathan Osman; 20.01.2010
comment
Также есть разделитель строк Unicode U + 2028, но я никогда не видел его в дикой природе. - person xan; 20.01.2010

Невозможно определить кодировку. Лучшее, что вы могли бы сделать, - это что-то вроде IE и зависеть от распределения букв на разных языках, а также от стандартных символов для языка. Но в лучшем случае это долгий путь.

Я бы посоветовал вам заполучить некоторую большую библиотеку наборов символов (ознакомьтесь с проектами, такими как iconv) и сделать все из них доступными для пользователя. Но не беспокойтесь об автоопределении. Просто позвольте пользователю выбрать кодировку по умолчанию, которая по умолчанию будет UTF-8.

person Vilx-    schedule 20.01.2010
comment
Что ж, я мог бы это сделать, но я не думаю, что внешняя библиотека - это вариант. - person Nathan Osman; 20.01.2010
comment
Не внешняя библиотека. Таблицы кодировки символов. Сопоставления между Unicode и другими наборами символов. Хотя внешняя библиотека значительно упростит преобразование. Я правильно понимаю, что вы сами пишете этот текстовый редактор, не так ли? - person Vilx-; 20.01.2010

Latin-1 (ISO-8859-1) и его расширение для Windows CP-1252 обязательно должны поддерживаться западными пользователями. Можно утверждать, что UTF-8 - лучший выбор, но у людей часто нет такого выбора. Китайским пользователям потребуется GB-18030, и помните, что есть и японцы, и русские, и греки, у которых есть собственные кодировки, помимо Unicode в кодировке UTF-8.

Что касается обнаружения, большинство кодировок не поддаются надежному обнаружению. В некоторых (например, Latin-1) определенные байтовые значения просто недопустимы. В UTF-8 может встречаться любое байтовое значение, но не каждая последовательность байтовых значений. На практике, однако, вы бы не стали выполнять декодирование самостоятельно, а использовали бы библиотеку кодирования / декодирования, пытались бы декодировать и отлавливать ошибки. Так почему бы не поддержать все кодировки, поддерживаемые этой библиотекой?

Вы также можете разработать эвристику, такую ​​как декодирование для определенной кодировки, а затем проверить результат на наличие странных символов или комбинаций символов или частоты появления таких символов. Но это никогда не будет безопасно, и я согласен с Вилксом, что тебе не стоит беспокоиться. По моему опыту, люди обычно знают, что файл имеет определенную кодировку или что возможно только два или три. Поэтому, если они видят, что вы выбрали неправильный вариант, они легко адаптируются. И посмотрите на других редакторов. Самое умное решение не всегда является лучшим, особенно если люди привыкли к другим программам.

person thieger    schedule 20.01.2010
comment
Я использую wxWidgets, который поддерживает UTF-16 и UTF-8, если я не ошибаюсь. - person Nathan Osman; 21.01.2010
comment
Я прочитал документацию, и wxWidgets поддерживает довольно много других, таких как UTF-32. Не то чтобы это очень распространенное явление, заметьте. - person Nathan Osman; 21.01.2010

UTF-16 не очень часто встречается в текстовых файлах. UTF-8 гораздо более распространен, потому что он обратно совместим с ASCII и указан в таких стандартах, как XML.

1) Проверьте спецификации различных кодировок Unicode. Если найдено, используйте эту кодировку.
2) Если нет спецификации, проверьте, является ли текст файла допустимым UTF-8, читая, пока не достигнете достаточного образца не-ASCII (поскольку многие файлы почти все ASCII, но могут иметь несколько акцентированных символы или умные кавычки), либо файл заканчивается. Если действительный UTF-8, используйте UTF-8.
3) Если не Unicode, это, вероятно, текущая кодовая страница по умолчанию для платформы.
4) Некоторые кодировки легко обнаружить, например, в японском Shift-JIS будет интенсивно использоваться префиксные байты 0x82 и 0x83, обозначающие хирагану и катакану.
5) Дайте пользователю возможность изменить кодировку, если предположение программы оказывается неверным.

person Joseph Boyle    schedule 22.01.2010

Что бы вы ни делали, используйте для снифф-теста более 256 байт. Важно сделать все правильно, так почему бы не проверить весь документ? Или, по крайней мере, первые 100 КБ или около того.

Попробуйте UTF-8 и очевидный UTF-16 (много чередующихся 0 байтов), затем вернитесь к кодовой странице ANSI для текущего языкового стандарта.

person xan    schedule 20.01.2010
comment
Дело принято. Но проверять весь файл, когда он составляет ›5 МБ или около того, нелепо и бессмысленно. - person Nathan Osman; 21.01.2010
comment
Я думаю, что нужно просто поддерживать UTF-16 и UTF-8. Стандартные символы ASCII одинаковы в ASCII и UTF-8, а остальные 128 символов, вероятно, можно игнорировать. - person Nathan Osman; 21.01.2010