我从网上得到一些字符串数据,我怀疑它并不总是它所说的那样。我不知道问题出在哪里,我只是不再关心。从这个项目的第一天开始,我就一直在与 Ruby 字符串编码作斗争。我真的很想用某种方式说:“这是一个字符串。它是什么?”,然后使用该数据将其转换为 UTF-8,这样它就不会gsub()
在我的应用程序深处爆炸 2,000 行。我已经检查过了rchardet
,但即使它现在应该适用于 1.9,但它只是在给定任何带有多个字节的输入时爆炸......这没有帮助。
7 回答
不可能从字符串中看出它的编码是什么。您总是需要一些额外的元数据来告诉您字符串的编码是什么。
如果您从 Web 获取字符串,则该元数据位于 HTTP 标头中。如果 HTTP 标头错误,那么您或 Ruby 或其他任何人绝对无能为力。您需要向您获取字符串的站点的网站管理员提交一个错误,然后等待他修复它。如果您与网站签订了服务水平协议,请提交错误,等待一周,然后起诉他们。
您无法真正检测到编码。你只能假设。
对于大多数西方语言应用程序,以下构造将起作用。传统的编码通常是“ISO-8859-1”。新的首选编码是 UTF-8。为什么不简单地尝试使用 UTF-8 对其进行编码并使用旧编码进行回退
def detect_encoding( str )
begin
str.encode("UTF-8")
"UTF-8"
rescue
"ISO-8859-1"
end
end
老问题,但 chardet 适用于 1.9:http ://rubygems.org/gems/chardet
为什么不尝试使用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
我们在ensure_encoding方面有一些很好的经验。它实际上为我们完成了将具有未知编码的资源文件转换为 UTF-8 的工作。
自述文件将为您提供一些提示,哪些选项适合您的情况。
自从 ensure_encoding 为我们完成这项工作以来,我从未尝试过chardet 。
我在这里介绍了我们如何使用 ensure_encoding。
尝试在您的环境中设置这些。
导出 LC_ALL=en_US.UTF-8 导出 LC_CTYPE=en_US.UTF-8
尝试ruby -EBINARY
或ruby -EASCII-8BIT
到命令行
尝试将-Ku
或添加-Kn
到您的 ruby 命令行。
你能粘贴错误信息吗?
也试试这个:http: //github.com/candlerb/string19/blob/master/string19.rb
可以尝试阅读以下内容:http: //yehudakatz.com/2010/05/05/ruby-1-9-encodings-a-primer-and-the-solution-for-rails/