Определить кодировку - PullRequest
10 голосов
/ 19 июня 2010

Я получаю некоторые строковые данные из Интернета, и я подозреваю, что это не всегда то, что говорится. Я не знаю, где проблема, и мне просто все равно. С самого первого дня в этом проекте я боролся с кодировкой строк Ruby. Я действительно хочу как-то сказать: «Вот строка. Что это?», А затем использовать эти данные, чтобы передать их в UTF-8, чтобы он не разрывал gsub() 2000 строк в глубине моего приложения. , Я проверил rchardet, но несмотря на то, что теперь он предположительно работает на 1.9, он просто взрывается при любом вводе с несколькими байтами ... что бесполезно.

Ответы [ 7 ]

9 голосов
/ 18 апреля 2016

Вы не можете обнаружить кодировку. Вы можете только предполагать это.

Для большинства западных языковых приложений, следующая конструкция буду работать. Традиционной кодировкой обычно является «ISO-8859-1». Новое и предпочтительное кодирование - UTF-8. Почему бы просто не попытаться закодировать его с помощью UTF-8 и использовать старый кодировку

def detect_encoding( str )
  begin
    str.encode("UTF-8")
    "UTF-8"
  rescue
    "ISO-8859-1"
  end
end
8 голосов
/ 19 июня 2010

Невозможно определить из строки, в какой она кодировке. Вам всегда нужны дополнительные метаданные, которые сообщают вам, какова кодировка строки.

Если вы получаете строку из Интернета, эти метаданныев заголовках HTTP.Если заголовки HTTP неверны, вы, Ruby или кто-либо другой, абсолютно ничего не можете сделать.Вам нужно сообщить об ошибке веб-мастеру сайта, с которого вы получили строку, и подождать, пока он ее исправит.Если у вас есть Соглашение об уровне обслуживания с веб-сайтом, сообщите об ошибке, подождите неделю, а затем подайте в суд на них.

3 голосов
/ 12 марта 2012

Старый вопрос, но Chardet работает на 1.9: http://rubygems.org/gems/chardet

2 голосов
/ 28 июля 2012

У нас был хороший опыт работы с sure_encoding .На самом деле он выполняет всю работу по преобразованию файлов ресурсов с неизвестной кодировкой в ​​UTF-8.

README даст вам несколько советов, какие варианты подойдут для вашей ситуации.

Iникогда не пробовал chardet , так как sure_encoding отлично справился с задачей.

Я рассмотрел здесь как мы используем sure_encoding.

1 голос
/ 12 июня 2017

почему бы не попробовать использовать https://github.com/brianmario/charlock_holmes, чтобы получить точную кодировку.Затем также используйте его для преобразования в UTF8

    require 'charlock_holmes'
    class EncodeParser
      def initialize(text)
        @text = text
      end

      def detected_encoding
        CharlockHolmes::EncodingDetector.detect(@text)[:encoding]
      end

      def convert_to_utf8
        CharlockHolmes::Converter.convert(@text, detected_encoding, "UTF-8")
      end
    end

, затем просто используйте EncodeParser.new (текст) .detected_encoding или EncodeParser.new (текст).convert_to_utf8

1 голос
/ 19 июня 2010

Попробуйте установить их в своей среде.

export LC_ALL=en_US.UTF-8
export LC_CTYPE=en_US.UTF-8

Попробуйте ruby -EBINARY или ruby -EASCII-8BIT в командной строке

Попробуйте добавить -Ku или -Kn в командную строку ruby.

Не могли бы вы вставить сообщение об ошибке?

Также попробуйте это: http://github.com/candlerb/string19/blob/master/string19.rb

0 голосов
/ 19 июня 2010
...