2017-02-10 4 views
1

В чем разница между Unicode и ASCII с точки зрения памяти? Сколько памяти занимает Unicode и ASCII в памяти? Я знаю, что в Юникоде это зависит от типа кодирования (UTF-8, UTF-16 и т. Д.). Но мне нужно более глубокое понимание!Unicode vs ASCII-память

+0

У вас есть googled для деталей? Есть тонны документов, которые могут дать более глубокое понимание. –

+0

@EmacsUser yes У меня есть, но я запутался из-за большого количества материалов, и что именно я должен прочитать ... Мне нужно резюме, точно описывающее мою проблему :) – john

+0

Насколько я понимаю, так мы получаем много повторяющихся вопросов. –

ответ

1

Короче говоря, ASCII использует 7 бит кодовых точек (т.е. 7 бит однозначно идентифицирует каждый символ), где в качестве Unicode определяется с помощью точки 21 бит кода (0 шестигранные к 10FFFF гекс, определяется как 17 плоскостей 65536/16 бит символов дает 1114112 символов - ближайшая сила двух равна 2). Сколько используемой памяти зависит от того, как она закодирована в памяти (не обязательно такая же, как кодирование сериализации, используемое для экстернализации этих данных в файлах, как правило, один из кодировок UTF для Unicode).

На практике ASCII хранится как один символ на каждый байт в ОЗУ, и очень редко можно увидеть чистый ASCII, особенно за пределами США, - более распространено видеть ISO8859-1 (8-битное кодирование, которое полностью совместимый с ASCII, но с другими символами, которые используют дополнительный бит, который доступен, например, для символов £ и ¡, необходимых в некоторых европейских странах).

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

  • Java использует 16-битные символы с идеей «суррогатной пары» для представления значений, которые находятся за пределами «основной многоязычной плоскости» (по существу, любой символом добавлен после Unicode 2.0). Это историческое; ранние версии Unicode использовали только 16 бит на символ.
  • В C может часто иметь смысл использовать кодировку UTF-8 с переменной длиной строки как представление в памяти - char в конце концов является байтом, но с такой кодировкой происходит небольшое поражение производительности при декодировании (это делает попытку найти n-ю кодовую точку сложнее, поскольку нужно эффективно выполнять итерацию по закодированному байтовому массиву, идентифицирующему начало каждого символа).
  • Может также иметь смысл использовать UTF-32 (ранее известный как UCS-4), поскольку он кодирует все кодовые точки Unicode в 32-битном целочисленном виде аналогично тому, как ASCII хранится в 8-битном целочисленном значении.

Joel's article является золотым для этой темы.

+0

я читал это, но еще больше смутился ... Итак, в нескольких словах ASCII использует 7 бит и unicode 32 ?? ... Почему я слышал, что Unicode использует 16 бит? – john

+0

Поскольку исходные коды Unicode составляли 16 бит - в Unicode 3.0 это изменилось и использовалось 32 бита. До этого было написано много документации и, в частности, ранних статей, ориентированных на Java. Есть также много людей, которые искренне верят, что это все еще так - возможно, потому что Java по-прежнему использует char (16-разрядный примитив) как символы в строках (во имя обратной совместимости). –

+0

или это были байты ... я перепутался ... – john