如何使用ruby 1.9转换字​​符编码

pho*_*oet 10 ruby encoding amazon

我目前在亚马逊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)
Run Code Online (Sandbox Code Playgroud)

Mla*_*vić 29

作为异常点,您的字符串是ASCII-8BIT编码的.你应该改变编码.有一个很长的故事,但如果你对快速解决方案感兴趣,只需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"
Run Code Online (Sandbox Code Playgroud)


Dav*_*ner 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 => '')
Run Code Online (Sandbox Code Playgroud)

ASCII-8BIT实际上是二进制的.此代码将编码转换为UTF-8,同时正确处理无效和未定义的字符.:invalid选项指定替换无效字符.:undef选项指定替换未定义的字符.而且:replace选项定义了应该替换无效或未定义字符的内容.在这种情况下,我选择简单地删除它们.