logo
Программирование на языке Ruby

Листинг 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.