|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Victor Wagner 2:5020/400 06 Jun 2006 23:44:58 To : "Dmitry N.Ananyev" Subject : Re: В какой кодировке Linux записывает строки в файлы? -------------------------------------------------------------------------------- Dmitry N.Ananyev <dtc.98@relcom.ru> wrote: DNA> В какой кодировке Linux записывает строки в файлы? Hи в какой. Файл с точки зрения Linux-а - поток байт. Понятие кодировки возникает на более высоком уровне - уровне прикладных программ. В системе есть понятие "локаль", которое определяет как следует обращаться с рядом вещей, зависящих от местоположения и языка пользователя. Одна из категорий локали - LC_CTYPE, которая задает интерпретацию символов как букв и не букв, и одно из свойств этой категории - кодировка. Локаль может быть задана для каждого процесса индивидуально, через переменные среды, хотя обычно она задается глобально для пользователя, или даже для системы в целом через установку данных переменных в стартовых скриптах bash (но никто не мешает для конкретного процесса значения этих переменных изменить). DNA> Можно явно задать кодировку строк (к примеру в bash), Можно преобразовать файл из текущей кодировки в любую другую с помощью утилиты iconv, которая является оболочкой вокруг библиотечной функции iconv. Многие программы (например vim) умеют работать с этой функцией непосредственно, и читать или писать файлы в любой кодировке в какой попросишь независимо от локали, в которой запущены. DNA> чтобы запись строк в файлы была в Unicode 2-х байтовом? Вот с этим - сложнее. Большая часть программ в Linux обрабатывает строки в текстовых файлах в соответствии с конвенциями языка C, т.е. первый же встретившийся нулевой байт (а в UCS2 он встретится в первом же ASCII-символе, т.е. пробеле, знаке препинания или латинской букве) будет воспринять как конец строки. Поэтому наиболее распространенным способом представления unicode в Linux является utf-8 - представление в котором на символ отводится переменное число байт и нулевые байты не встречаются. Рекомендуется с этим представлением и работать, ну а если уж приспичило получить файл в ucs2, преобразовывать данные в эту кодировку с помощью iconv в самый последний момент, когда вся обработка уже произведена. Кстати, существуют два способа двухбайтового представления того подмножества unicode, которое влезает в 2 байта (вообще-то это не весь юникод, там больше 65536 символов) - в одном из них в каждой паре байтов старший байт идет первым, а младший вторым, точно так же как в записи числа мы сначала пишем старшие разряды, а потом младшие. Это так называемый Big-Endian byte order который используется в качестве стандартного для передачи многобайтовых чисел по сети, а также для внутреннего представления в процессорах Sparc, PowerPC и многих других. Во втором способе младший байт идет сначала, а старший потом. Почему-то в процессорах Intel этот уродский и нечелеовеческий (т.е. не похожий на запись чисел на бумаге) порядок выбран для внутреннего представления чисел. Hазывается Little-Endian. Соответственно, iconv поддерживает выходные кодировки UCS-2LE и UCS-2BE. DNA> Заранее спасибо. -- --- ifmail v.2.15dev5.3 * Origin: Free Net of Leninsky,45 (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /ru.linux/1517893455da0.html, оценка из 5, голосов 10
|