Внутренняя и внешняя кодировка против Unicode - PullRequest
3 голосов
/ 21 сентября 2011

Поскольку в комментариях к этому вопросу было много неправильной информации, распространяемой несколькими авторами: Список проблем C ++ ABI

Я создал это, чтобы уточнить.

  1. Какие кодировки используются для строк в стиле C?
  2. Linux использует UTF-8 для кодирования строк?
  3. Как внешнее кодирование связано с кодированием, используемым в узких и широких строках?

Ответы [ 2 ]

4 голосов
/ 21 сентября 2011
  1. Реализация определена.Или даже приложение определено;стандарт на самом деле не накладывает никаких ограничений на то, что приложение делает с ними, и ожидает, что многое будет зависеть от локали.Все, что действительно определено реализацией, - это кодировка, используемая в строковых литералах.

  2. В каком смысле.Большая часть ОС игнорирует большинство кодировок;у вас будут проблемы, если '\0' не является нулевым байтом, но даже EBCDIC отвечает этому требованию.В противном случае, в зависимости от контекста, будет несколько дополнительных символов, которые могут быть значительными (например, '/' в именах путей);все они используют первые 128 кодировок в Unicode, поэтому будут иметь однобайтовую кодировку в UTF-8.В качестве примера я использовал UTF-8 и ISO 8859-1 для имен файлов в Linux.Единственная реальная проблема - их отображение: если вы наберете ls в xterm, например, ls и xterm будет предполагать, что имена файлов находятся в той же кодировке, что и шрифт дисплея.

  3. Это в основном зависит от локали.В зависимости от локали, внутренняя кодировка узкой символьной строки вполне может не соответствовать кодировке, используемой для строковых литералов.(Но как может быть иначе, поскольку кодировка строкового литерала должна быть определена во время компиляции, где внутренняя кодировка для узких символьных строк зависит от локали, используемой для ее чтения, и может варьироваться от одной строки к следующей.)

Если вы разрабатываете новое приложение для Linux, я настоятельно рекомендую использовать Unicode для всего, с UTF-32 для строк широких символов и UTF-8 для строк узких символов,Но не рассчитывайте ни на что, кроме первых 128 точек кодирования, работающих в строковых литералах.

0 голосов
/ 21 сентября 2011
  1. Это зависит от архитектуры. Большинство архитектур Unix используют UTF-32 для широких строк (wchar_t) и ASCII для (char). Обратите внимание, что ASCII - это всего лишь 7-битная кодировка. Windows использовала UCS-2 до Windows 2000, более поздние версии используют переменную кодировку UTF-16 (для wchar_t).
  2. Нет. Большинство системных вызовов в Linux не зависят от кодировки (им все равно, что это за кодировка, поскольку они никоим образом не интерпретируют ее). Внешняя кодировка фактически определяется вашей текущей локалью.
  3. Внутренняя кодировка, используемая узкими и широкими строками, является фиксированной, она не меняется при изменении локали. Изменяя локаль, вы изменяете функции перевода, которые кодируют и декодируют данные, которые входят / выходят из вашей программы (при условии, что вы придерживаетесь стандартных текстовых функций языка Си).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...