如何使用ruby 1.9转换字符编码
我目前在亚马逊api的结果方面遇到麻烦。
该服务返回一个带有unicode字符的字符串: 在Mac上学习Objective \ xE2 \ x80 \ x93C(学习系列)
使用ruby 1.9.1,甚至无法处理字符串:
REXML::ParseException: # ... Exception parsing Line: 1 Position: 1636 Last 80 unconsumed characters: Learn Objective–C on the Mac (Learn Series)
作为例外点,您的字符串是ASCII-8BIT编码的。 您应该更改编码。 有一个很长的故事 ,但如果你对快速解决方案感兴趣,只需在执行任何处理之前对字符串force_encoding
:
s = "Learn Objective\xE2\x80\x93C on the Mac" # => "Learn Objective\xE2\x80\x93C on the Mac" s.encoding # => # s.force_encoding 'utf-8' # => "Learn Objective–C on the Mac"
如果用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选项定义了应该替换无效或未定义字符的内容。 在这种情况下,我选择简单地删除它们。