12

我从网上得到一些字符串数据,我怀疑它并不总是它所说的那样。我不知道问题出在哪里,我只是不再关心。从这个项目的第一天开始,我就一直在与 Ruby 字符串编码作斗争。我真的很想用某种方式说:“这是一个字符串。它是什么?”,然后使用该数据将其转换为 UTF-8,这样它就不会gsub()在我的应用程序深处爆炸 2,000 行。我已经检查过了rchardet,但即使它现在应该适用于 1.9,但它只是在给定任何带有多个字节的输入时爆炸......这没有帮助。

4

7 回答 7

9

不可能从字符串中看出它的编码是什么。您总是需要一些额外的元数据来告诉您字符串的编码是什么。

如果您从 Web 获取字符串,则该元数据位于 HTTP 标头中。如果 HTTP 标头错误,那么您或 Ruby 或其他任何人绝对无能为力。您需要向您获取字符串的站点的网站管理员提交一个错误,然后等待他修复它。如果您与网站签订了服务水平协议,请提交错误,等待一周,然后起诉他们。

于 2010-06-19T11:20:02.483 回答
8

您无法真正检测到编码。你只能假设。

对于大多数西方语言应用程序,以下构造将起作用。传统的编码通常是“ISO-8859-1”。新的首选编码是 UTF-8。为什么不简单地尝试使用 UTF-8 对其进行编码并使用旧编码进行回退

def detect_encoding( str )
  begin
    str.encode("UTF-8")
    "UTF-8"
  rescue
    "ISO-8859-1"
  end
end
于 2016-04-18T12:44:22.440 回答
3

老问题,但 chardet 适用于 1.9:http ://rubygems.org/gems/chardet

于 2012-03-12T17:15:42.467 回答
3

为什么不尝试使用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(text).detected_encoding 或 EncodeParser.new(text)。转换为utf8

于 2017-06-12T12:16:24.950 回答
2

我们在ensure_encoding方面有一些很好的经验。它实际上为我们完成了将具有未知编码的资源文件转换为 UTF-8 的工作。

自述文件将为您提供一些提示,哪些选项适合您的情况。

自从 ensure_encoding 为我们完成这项工作以来,我从未尝试过chardet 。

我在这里介绍了我们如何使用 ensure_encoding。

于 2012-07-28T10:03:35.520 回答
1

尝试在您的环境中设置这些。

导出 LC_ALL=en_US.UTF-8
导出 LC_CTYPE=en_US.UTF-8

尝试ruby -EBINARYruby -EASCII-8BIT到命令行

尝试将-Ku或添加-Kn到您的 ruby​​ 命令行。

你能粘贴错误信息吗?

也试试这个:http: //github.com/candlerb/string19/blob/master/string19.rb

于 2010-06-19T11:17:35.537 回答
0

可以尝试阅读以下内容:http: //yehudakatz.com/2010/05/05/ruby-1-9-encodings-a-primer-and-the-solution-for-rails/

于 2010-06-19T08:11:00.457 回答