Внутреннее и внешнее кодирование против Unicode

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

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

  • Каковы кодировки, используемые для строк стиля C?
  • Является ли Linux использующим UTF-8 для кодирования строк?
  • Как внешнее кодирование относится к кодировке, используемой узкими и широкими строками?

Ответ 1

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

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

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

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

Ответ 2

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