Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

Помимо названия кодировки,

iconv
принимает еще флаги, управляющие ее поведением. Они указываются в конце строки, содержащей целевую кодировку.

Обычно

iconv
возбуждает исключение, если получает недопустимые входные данные или почему-либо не может представить их в целевой кодировке. Флаг
//IGNORE
подавляет исключение.

broken_utf8_string = "hello\xfe"

converter = Iconv.new('ISO-8859-15', 'UTF-8')

# будет возбуждено исключение Iconv::IllegalSequence

converter.iconv(broken_utf8_string)

converter = Iconv.new('ISO-8859-15//IGNORE', 'UTF-8')

converter.iconv(broken_utf8_string) # "hello"

Этот же флаг позволяет очистить строку от неверных данных:

broken_sword = "'ep'ee\xfe"

converter = Iconv.new('UTF-8//IGNORE', 'UTF-8')

converter.iconv(broken_sword) # "'ep'ee"

Иногда некоторые символы нельзя представить в целевой кодировке. Обычно в этом случае возбуждается исключение. Флаг

//TRANSLIT
говорит
iconv
, что нужно вместо этого попытаться подобрать приблизительные эквиваленты.

converter = Iconv.new('ASCII', 'UTF-8')

converter.iconv(sword) # Возбуждается Iconv::IllegalSequence.

converter = Iconv.new('ASCII//IGNORE', 'UTF-8')

converter.iconv(sword) # "pe"

converter = Iconv.new('ASCII//TRANSLIT', 'UTF-8')

converter.iconv(sword) # "'ep'ee"

Этим свойством можно воспользоваться, чтобы получить URL, содержащий только ASCII-символы:

str = "Strasse 'ep'ee"

converter = Iconv.new('ASCII//TRANSLIT', 'UTF-8')

converter.iconv(sword).gsub(/ /, '-').gsub(/[^а-z\-]/in).downcase

# "strasse-epee"

Однако работать это будет лишь в отношении латиницы. В листинге 4.2 приведен реальный пример совместного применения библиотек

iconv
и
open-uri
для скачивания Web-страницы и перекодирования ее в UTF-8.

Листинг 4.2. Перекодирование Web-страницы в кодировку UTF-8

require 'open-uri'

require 'iconv'

def get_web_page_as_utf8(url)

 open(url) do |io|

source = io.read

type, *parameters = io.content_type_parse

# He перекодировать, если не (X)HTML

unless type =~ %r!^(?:text/html|application/xhtml+xml)$!

return source

end

# Сначала проверяем заголовки, присланные сервером:

if pair = parameters.assoc('charset')

encoding = pair.last

# Затем анализируем HTML:

elsif source =~ ?\]*?charset=([^\s'"]+)/i

encoding = $1

# Если не удалось определить, предполагаем кодировку по умолчанию,

# определенную в стандарте HTTP.

else

encoding = 'ISO-8859-1'

end

converter = Iconv.new('UTF-8//IGNORE', encoding)

return converter.iconv(source)

 end

end

Это еще не все системные вопросы, связанные с преобразованием кодировок. Предположим, что в операционной системе, где установлен Ruby, определена локаль, отличная от UTF-8, или Ruby общается с ОС не в UTF-8 (так, например, обстоит дело в дистрибутиве для Win32). Тогда возникают дополнительные сложности.

Например, Windows поддерживает Unicode в именах файлов и на системном уровне работает исключительно в Unicode. Но в настоящее время Ruby взаимодействует с Windows при помощи устаревших кодовых страниц. Для англоязычного и большинства других западных изданий это страница 1252 (или

WINDOWS-1252
).

Внутри программы можно пользоваться и кодировкой UTF-8, но все имена файлов придется перевести в кодировку, заданную кодовой страницей. Iconv поможет это сделать, но важно не забывать, что кодовая страница позволяет описать только малое подмножество всех символов, имеющихся в Unicode.

Кроме того, это означает, что пока Ruby для Windows не может открывать файлы, имена которых нельзя описать с помощью кодовой страницы. Это ограничение не относится к Mac OS X, Linux и другим системам с локалью UTF-8.

4.3. Справочники сообщений

Ложбан не зависит от национальных особенностей. Его словарь был создан алгоритмически на основе шести наиболее распространенных в мире разговорных языков: китайского, хинди, английского, русского, испанского и арабского.

Nick Nicholas, John Cowan. What is Lojban?

Справочник сообщений — это набор сообщений на одном языке. Данное понятие неотъемлемо от концепции локализации (L10N). Идея в том, чтобы отделить языково-зависимые строки от остальной программы. Тогда для того, чтобы программа «заговорила» на другом языке, достаточно всего лишь подменить справочник.

«Наилучший» способ реализовать эту идею в Ruby — воспользоваться библиотекой Ruby-GetText-Package. Я буду называть ее просто

gettext
, поскольку именно так называется содержащий ее файл (не путайте с утилитой
gettext
!). Эту великолепную библиотеку написал Macao Муто (Masao Mutoh), он же очень помог при написании данного раздела.

Поделиться:
Популярные книги

Антон Чехов

Труайя Анри
Проза:
историческая проза
5.00
рейтинг книги
Антон Чехов

Лекарь Империи 6

Карелин Сергей Витальевич
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 6

Директива Джэнсона

Ладлэм Роберт
Детективы:
шпионские детективы
7.00
рейтинг книги
Директива Джэнсона

Я – Легенда

Гарцевич Евгений Александрович
1. Я - Легенда!
Фантастика:
боевая фантастика
попаданцы
рпг
фантастика: прочее
5.00
рейтинг книги
Я – Легенда

Учитель из прошлого тысячелетия

Еслер Андрей
6. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Учитель из прошлого тысячелетия

Наномашины, ученик! Том 6

Новиков Николай Васильевич
6. Первый среди карапузов
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наномашины, ученик! Том 6

Кодекс Крови. Книга VII

Борзых М.
7. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
аниме
5.25
рейтинг книги
Кодекс Крови. Книга VII

Локки 7. Потомок бога

Решетов Евгений Валерьевич
7. Локки
Фантастика:
аниме
эпическая фантастика
фэнтези
5.00
рейтинг книги
Локки 7. Потомок бога

Вторжение

Гагарин Станислав Семенович
Фантастика:
детективная фантастика
4.50
рейтинг книги
Вторжение

АПРК «Курск». Послесловие к трагедии

Шигин Владимир Виленович
Досье
Документальная литература:
прочая документальная литература
5.00
рейтинг книги
АПРК «Курск». Послесловие к трагедии

Бездна

Роллинс Джеймс
102. Книга-загадка, книга-бестселлер
Детективы:
триллеры
9.19
рейтинг книги
Бездна

Наследие Маозари 8

Панежин Евгений
8. Наследие Маозари
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 8

Дневник (1887-1910)

Ренар Жюль
Проза:
проза прочее
4.00
рейтинг книги
Дневник (1887-1910)

Осень 1943 года

Антонова Людмила Викторовна
15. Летопись Победы. 1443 дня и ночи до нашей Великой Победы во Второй мировой войне
Научно-образовательная:
история
cпецслужбы
военная история
5.00
рейтинг книги
Осень 1943 года