Книга: Программирование на языке 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.

Оглавление книги


Генерация: 3.191. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз