Emacs для начинающих



         

Локализация и POSIX.


    Если мы говорим о файле, то в идеологии POSIX, - это просто плоская последовательность байтов. Внутреннее содержимое не стандартизовано никак. Поэтому невозможно определить, какую информацию содержит файл, а если он содержит текстовую информацию -- в какой она кодировке. То же самое можно сказать о потоках : stdin/stdout

-- это потоки байтов (кодов). Кодировка (т.е. соответствие символ-код (CES)) полностью потеряна и нигде не указывается. И POSIX

вовсе не гарантирует, что CES (кодировка) stdin

будет совпадать с текущей локализацией, заданной через LANG=.

    Точно тактая же ситуация с терминальным : кодировка терминала совершенно неизвестна приложению.

   К сожалению, в стандарте POSIX

поддержка Charset не имеет полностью идеологически стройной и ясной концепции. Понятие Charset существует только для locale API и тех функций, которые зависят от locale.

    Более того, в "чистом" POSIX

вообще невозможно

узнать (получить) имя Charset после вызова . Единственный способ, узнать Charset текущей locale

- это воспользоваться не-POSIX функцией XPG

(но определенной в Single UNIXSVID

и Unix98) : (определена в файле ). Тогда текущий Сharset можно получить так :

#include <locale.h> #include <langinfo.h>

... setlocale(LC_ALL,""); printf ("Current charset = %s\n",nl_langinfo(CODESET));

     Надо ли говорить, что некоторые UNIX

(например ) не имеют этих XPG-extensions и не имеют функции как таковой вообще. (Что очень странно, поскольку в том же POSIX определена утилита c keyword-ом codeset которая "как-то" это имя определяет...) Например, популярная система до сих пор не имеет функции (как впрочем не имеет и утилиты , увы !).

    Еще один способ определения текущего Charset-а - это разбор

переменной окружения . По стандарту POSIX переменная LANG=

задается в форме LANG=language_TERRITORY.Codeset. Например, переменная




Содержание  Назад  Вперед