我目前在亚马逊api的结果方面遇到了麻烦。
服务返回带有unicode字符的字符串:在Mac上学习Objective \ xE2 \ x80 \ x93C(学习系列)
使用ruby 1.9.1,甚至无法处理字符串:
REXML::ParseException: #<Encoding::CompatibilityError: incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string)>
...
Exception parsing
Line: 1
Position: 1636
Last 80 unconsumed characters:
Learn Objective–C on the Mac (Learn Series)
答案 0 :(得分:29)
作为异常点,您的字符串是ASCII-8BIT编码的。你应该改变编码。有一个long story,但是如果你对快速解决方案感兴趣,那么在进行任何处理之前只需要force_encoding
字符串:
s = "Learn Objective\xE2\x80\x93C on the Mac"
# => "Learn Objective\xE2\x80\x93C on the Mac"
s.encoding
# => #<Encoding:ASCII-8BIT>
s.force_encoding 'utf-8'
# => "Learn Objective–C on the Mac"
答案 1 :(得分:25)
如果用ASCII-8BIT编码的所有东西都可以直接转换为UTF-8,那么Mladen的解决方案就可以工作。当有1)无效的字符或2)UTF-8中未定义的字符时,它会中断。但是,这将有效(在1.9.2及更高版本中:
new_str = s.encode('utf-8', 'binary', :invalid => :replace,
:undef => :replace, :replace => '')
ASCII-8BIT实际上是二进制的。此代码将编码转换为UTF-8,同时正确处理无效和未定义的字符。 :invalid选项指定替换无效字符。 :undef选项指定替换未定义的字符。并且:replace选项定义了应该替换无效或未定义字符的内容。在这种情况下,我选择简单地删除它们。