Как программа определяет тип кодировки перед чтением файла? - PullRequest
1 голос
/ 14 июля 2020

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

Теперь, когда программа пытается прочитать этот файл, как знает ли он о типе кодировки, использованной для этого файла? Использует ли программа по умолчанию тип кодирования, например. UTF-8? Если это так, предположим, что программа, которая по умолчанию использует ascii, будет ли она неправильно читать файл UTF-8, учитывая, что есть символы, которые не принадлежат стандарту ascii? Или как-нибудь выяснит, что это не ascii и соответственно прочитает? Если да, то как?

Второе предположение: информация о кодировке может быть встроена в сам файл, который вычисляется программой. Если да, то как это происходит?

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Как правило, невозможно распознать набор символов файла.

Современные программы и браузеры в основном основаны на UTF-8. Некоторые редакторы даже пишут метку порядка байтов (0xEF 0xBB 0xBF для обозначения формата) в начале файла, чтобы запомнить кодировку. В Юникоде есть недопустимые коды символов, которые можно использовать для идентификации других кодировок:

Прежде всего, каждый символ в UTF-8 должен иметь форму 0xxxxxxx, где x - произвольный бит. . Есть три исключения:

  • байт 10xxxxxx должен следовать за байтом 110xxxxx
  • два байта 10xxxxxx должны следовать за байтом 1110xxxx
  • три байта 10xxxxxx должны следовать за байтом 11110xxx

Дополнительные пояснения см., например, здесь .

На веб-сайтах (т.е. в HTML) кодировка указывается отдельно с помощью тегов типа

<meta http-equiv="content-type" content="text/html;charset=UTF-8">
0 голосов
/ 14 июля 2020

Вообще нет возможности узнать кодировку. Особенно в прошлом многие кодировки кажутся похожими (только с разными акцентированными символами).

Для многих протоколов inte rnet существует способ передать кодировку, чтобы программа знала предполагаемая кодировка. Вы видите это с электронной почтой, ftp, http. Также в базах данных теперь нужно указывать кодировку (и, возможно, язык для сортировки строк).

Но для обычного текстового файла это было сложно. Многие программы пытаются правильно получить новую строку ( новая строка [unix] против перевод строки вместе с возврат каретки [ASCII], а иногда просто возврат каретки [старый Mac]) [Примечание: новая строка и перевод строки - это один и тот же символ].

Теперь мы находятся в гораздо более стандартизированном мире, поэтому кодирование проще. Часто у нас есть такой алгоритм:

  • Проверьте первые байты, если вы видите правильный BOF (3 разных способа запуска файла), вы интерпретируете его как UTF-8, UTF-16LE или UTF-16BE.

  • На машинах, отличных от Windows (или на Windows, но для веб-файлов):

    • Предположим это UTF-8. Если все в порядке, это должен быть UTF-8 (может быть, просто попробуйте первый блок символов [например, 4096]). UTF-8 имеет очень строгую последовательность символов (и запрещенных символов), поэтому файл, не относящийся к UTF-8, обычно не проходит проверку UTF-8. Примечание. ASCII - это подмножество UTF-8, поэтому вы будете правильно декодировать файлы ASCII в этой точке.

    • В противном случае предполагайте, что кодировка Latin-1 или «Windows ANSI» в другом Windows кодовых страниц (например, из вашей системы: вероятно, кто написал файл, с вашего же языка). Latin-1 - это подмножество «Windows ANSI» (и других кодовых страниц windows, и большинство символов должно быть в порядке.

  • На машинах Windows: go до указанной выше точки [UTF-8, с откатом], если вы в поле / niche / settings обычно можете ожидать UTF-8

    • иначе: допустим, Latin- 1 или подходящей кодировкой «Windows ANSI». Windows попробуйте добавить спецификацию в UTF-8
  • В любом случае нужно разрешить пользователю указать кодировку (например, в случае сбоя вышеупомянутого алгоритма).

Для азиатских языков существуют другие алгоритмы, обычно проверяющие частые байты и группы байтов.

Примечание: есть также библиотеки, которые помогают определять язык, но наверняка вы видели программы и браузеры, которые не могли определить правильную кодировку. Это неизбежно.

Теперь Unicode становится стандартным способом, а «Windows ANSI» заменяет большинство всех кодировок для латинских шрифтов, поэтому задача несложная, но если нужно конвертировать старые файлы.

...