Книга: Программирование на языке Ruby
4.2.1. Библиотека jcode и переменная $KCODE
4.2.1. Библиотека jcode и переменная $KCODE
Чтобы использовать в Ruby разные наборы символов, вы должны знать о глобальной переменной $KCODE
, от значения которой зависит поведение многих системных методов, манипулирующих строками. (Кстати говоря, буква K — напоминание о кандзи, одной из иероглифических азбук в японском языке.) Эта переменная принимает одно из пяти стандартных значений, каждое из которых представлено одной буквой, неважно — строчной или прописной (ASCII и NONE — одно и то же).
a ASCII
n NONE (ASCII)
е EUC
s SJIS
u UTF-8
Для ясности можно пользоваться и полными названиями (например, $KCODE="UTF-8"
). Важен только первый символ.
О кодировке ASCII мы уже знаем. EUC и Shift-JIS (SJIS) нам малоинтересны. Мы сосредоточимся на значении UTF-8.
Установив значение $KCODE
, вы задаром получаете весьма богатую функциональность. Например, метод inspect
(он автоматически вызывается при обращении к методу p для печати объекта в читаемом виде) обычно учитывает текущее значение $KCODE
.
$KCODE = "n"
# Для справки: французское слово "?p?e"
# обозначает разновидность меча (sword).
eacute = ""
eacute << 0303 << 0251 # U+00E9
sword = eacute + "p" + eacute + "e"
p eacute # "303251"
p sword # "303251p303251e"
$KCODE = "u"
p eacute # "?"
p sword # "?p?e"
Регулярные выражения в режиме UTF-8 тоже становятся несколько «умнее».
$KCODE = "n"
letters = sword.scan(/(.)/)
# [["303"], ["251"], ["p"], ["303"], ["251"], ["e"]]
puts letters.size # 6
$KCODE = "u"
letters = sword.scan(/(.)/)
# [["?"], ["p"], ["?"], ["e"]]
puts letters.size # 4
Библиотека jcode
предоставляет также несколько полезных методов, например jlength
и each_char
. Рекомендую включать эту библиотеку с помощью директивы require
всякий раз, как вы работаете с кодировкой UTF-8.
В следующем разделе мы снова рассмотрим некоторые типичные операции со строками и регулярными выражениями. Заодно поближе познакомимся с jcode
.
- Переменная jiffies
- Пример 9-8. Содержимое $* и $@, когда переменная $IFS -- пуста
- 17.2.1. Библиотека setup.rb
- 15.2.1. Стандартная библиотека rss
- Библиотека Ext Core
- А.2.4. Библиотека ccmalloc
- 13.2. Локали и библиотека С
- 15.5.1. Библиотека dbug — усовершенствованный printf()
- Клиентская библиотека Firebird
- Стандартная библиотека ввода
- API, POSIX и библиотека С
- Библиотека Oracle XDK