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