Путаница с кодировкой символов! - PullRequest
3 голосов
/ 21 мая 2009

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

Я спрашиваю, мой вопрос сводится к

1) How do each of the above store characters as bytes
2) What are the differences between the above standards
3) What is a code page
4) Method of converting characters between the various types.

Большое спасибо:)

Ответы [ 6 ]

12 голосов
/ 21 мая 2009

Я нашел статью Джоэла о Юникоде, чтобы объяснить это очень хорошо. В частности, он охватывает историю (необходимую для данной темы), кодировки (UTF-8/16 и т. Д.) И кодовые страницы.

4 голосов
/ 21 мая 2009

Чтобы быстро попытаться ответить на ваши конкретные вопросы.

1: определенная комбинация битов представляет определенный символ. Один символ может храниться в нескольких байтах.

2: Краткая информация и различия между упомянутыми вами кодировками.

ASCII
Включает определения для 128 символов.

ANSI
Имеет больше символов, чем ASCII, но все еще помещается в октет. Требуется кодовая страница.

UTF-8
Это может быть использовано для представления любого символа Unicode. Есть намного больше символов Unicode, чем ASCII. Каждый символ хранится в одном-четырех октетах данных.

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

3: Кодовая страница - это то, что указывает компьютеру, какой (комбинация битов) относится к какому символу. Unicode не нуждается в кодовых страницах, так как каждый символ имеет свою уникальную битовую комбинацию. ANSI имеет кодовые страницы, потому что он имеет только 256 доступных символов. Например, если вы работаете на арабском компьютере, в качестве кодовой страницы вам будет задан арабский язык, и арабские символы могут отображаться.

4: Метод преобразования зависит от набора символов, в который вы конвертируете, и от используемых кодовых страниц (если есть). Некоторые преобразования могут быть невозможны. UTF-8 обратно совместим с ASCII, а это означает, что если ваш текст содержит только первые 128 символов США, он точно такой же, как и тот же текст в кодировке ASCII.

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

0 голосов
/ 26 марта 2010

Пара случайных точек, которые полезно знать:

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

    То, как это происходит, заключается в том, что UTF-8 - переменная длина; первый" 127 символов представлены каждый байт. Помимо этого, это начинает использовать несколько байтов. Как декодер знает, следует ли интерпретировать байт как один символ ASCII или как часть многобайтовой последовательности? Потому что биты в начале Байты следуют определенным схемам: нулевой бит в начале означает, что это однобайтовый символ и n 1 бит означает, что этот байт является началом n последовательность байтов.

  • Кроме того, разные языки будут конвертировать их родные строки в разные кодировки при выводе они, например, распечатать их в файл или на экране. Следовательно, если вы заинтересованы в взаимозаменяемость между языками и платформы, вы должны всегда укажите, как вы хотите, чтобы ваш типы строк языка для вывода. В противном случае вы получите странные и неожиданные ошибки!

  • UTF-8 также является стандартом для XML.

0 голосов
/ 21 мая 2009

В Unix используйте программу с именем recode или iconv для преобразования текстовых файлов в другую кодировку или используйте функцию iconv (man 3 iconv) в вашей программе на C или C ++.

Если вы используете Perl, используйте для конвертации модуль Encode (например, use Encode; print encode("utf-8", "\xabfoo")). Если вы используете Python, используйте unicode.encode и / или str.decode (например, print u'\xabfoo'.encode('utf-8')).

0 голосов
/ 21 мая 2009

Обработка информации O'Reilly CJKV содержит много информации о наборах символов и кодировках символов: с особым вниманием к данным CJKV, конечно. Мне показалось полезным вывести мое понимание за пределы слова «как мне получить! *! ** # @ символ евро, чтобы он правильно отображался?».

...