Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
ES_SORT = map_table(%w( a,A,á,Á b,B c,C d,D е,Е,é,É f,F g,G h,H i,I,í,Í j,J k,K l,L m,M n,N ñ,Ñ o,O,ó,Ó p,P q,Q r,R s,S t,T u,U,u,U v,V w,W x,X y,Y z,Z))def transform_es(str) array = Unicode.normalize_KC(str).scan(/./u) array.map {|c| ES_SORT[c] || c}.joinendarray = %w[éste estoy año apogeo amor]array.map {|a| transform_es(a) }# ["etue", "etupz", "aop", "aqpgep", "amps"]collate(array) {|a| transform_es(a) }# ["amor", "año", "apogeo", "éste", "estoy"]В реальности упорядочение немного сложнее, чем показано в примерах выше; обычно требуется до трех уровней обработки. На первом уровне сравниваются только базовые символы без учета диакритических знаков и регистра, на втором учитываются диакритические знаки, а на третьем — регистр. Второй и третий уровень необходимы лишь в том случае, когда на предыдущих уровнях строки совпали. Кроме того, в некоторых языках последовательности, состоящие из нескольких символов, сортируются как единая семантическая единица (например, в хорватском lj расположено между l и m). Поэтому разработка языковозависимого или обобщенного алгоритма сортировки — задача нетривиальная: необходимо хорошо разбираться в конкретном языке. Невозможно изобрести по-настоящему универсальный алгоритм сортировки, который давал бы правильные результаты для всех языков, хотя попытки в этом направлении производились.
4.2.6. Преобразование из одной кодировки в другую
В стандартной библиотеке Ruby имеется интерфейс к библиотеке
iconvЧтобы преобразовать строку из UTF-8 в ISO-8859-15, библиотека
iconvrequire 'iconv'converter = Iconv.new('ISO-8859-15', 'UTF-8')sword_iso = converter.iconv(sword)Важно помнить, что сначала указывается целевая кодировка, а потом исходная (как при присваивании). Количество и названия поддерживаемых кодировок зависят от платформы, но наиболее распространенные стандартизованы и имеются везде. Если установлена пакетная утилита
iconviconv -lПомимо названия кодировки,
iconvОбычно
iconv//IGNOREbroken_utf8_string = "helloxfe"converter = Iconv.new('ISO-8859-15', 'UTF-8')# будет возбуждено исключение Iconv::IllegalSequenceconverter.iconv(broken_utf8_string)converter = Iconv.new('ISO-8859-15//IGNORE', 'UTF-8')converter.iconv(broken_utf8_string) # "hello"Этот же флаг позволяет очистить строку от неверных данных:
broken_sword = "épéexfe"converter = Iconv.new('UTF-8//IGNORE', 'UTF-8')converter.iconv(broken_sword) # "épée"Иногда некоторые символы нельзя представить в целевой кодировке. Обычно в этом случае возбуждается исключение. Флаг
//TRANSLITiconvconverter = 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 = "Straße épée"converter = Iconv.new('ASCII//TRANSLIT', 'UTF-8')converter.iconv(sword).gsub(/ /, '-').gsub(/[^а-z-]/in).downcase# "strasse-epee"Однако работать это будет лишь в отношении латиницы. В листинге 4.2 приведен реальный пример совместного применения библиотек
iconvopen-urirequire '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 # Если не удалось определить, предполагаем кодировку по умолчанию,
