cra*_*com 45 ruby utf-8 internationalization
我正在从远程站点提取文本并尝试将其加载到默认使用utf-8的Ruby 1.9/Rails 3应用程序中.
以下是一些违规文字的示例:
Cancer Res; 71(3); 1-11. ©2011 AACR.\n
Run Code Online (Sandbox Code Playgroud)
扩展的版权代码如下所示:
Cancer Res; 71(3); 1-11. \xC2\xA92011 AACR.\n
Run Code Online (Sandbox Code Playgroud)
Ruby告诉我字符串被编码为ASCII-8BIT并且输入我的Rails应用程序让我这样:
incompatible character encodings: ASCII-8BIT and UTF-8
Run Code Online (Sandbox Code Playgroud)
我可以使用此正则表达式删除版权代码
str.gsub(/[\x00-\x7F]/n,'?')
Run Code Online (Sandbox Code Playgroud)
产生这个
Cancer Res; 71(3); 1-11. ??2011 AACR.\n
Run Code Online (Sandbox Code Playgroud)
但是如何在UTF-8中将版权符号(以及其他各种符号,如希腊字母)转换为相同的符号?当然有可能......
我看到使用force_encoding的引用,但这不起作用:
str.force_encoding('utf-8').encode
Run Code Online (Sandbox Code Playgroud)
我意识到还有很多其他人有类似的问题,但我还没有看到一个有效的解决方案.
Phr*_*ogz 67
这对我有用:
#encoding: ASCII-8BIT
str = "\xC2\xA92011 AACR"
p str, str.encoding
#=> "\xC2\xA92011 AACR"
#=> #<Encoding:ASCII-8BIT>
str.force_encoding('UTF-8')
p str, str.encoding
#=> "©2011 AACR"
#=> #<Encoding:UTF-8>
Run Code Online (Sandbox Code Playgroud)
Jas*_*iss 28
有两种可能性:
输入数据已经是UTF-8,但Ruby只是不知道它.这似乎是你的情况,因为"\ xC2\xA9"是版权符号的有效UTF-8.在这种情况下,您只需要使用force_encoding告诉Ruby数据已经是UTF-8.
例如,"\ xC2\xA9".force_encoding('ASCII-8BIT')将重新创建输入数据的相关位.而"\ xC2\xA9".force_encoding('ASCII-8BIT').force_encoding('UTF-8')将证明你可以告诉Ruby它真的是UTF-8并获得所需的结果.
输入数据采用其他编码方式,您需要Ruby将其转码为UTF-8.在这种情况下,你必须告诉Ruby当前的编码是什么(ASCII-8BIT是ruby-speak for binary,它不是真正的编码),然后告诉Ruby对其进行转码.
例如,假设您的输入数据是ISO-8859-1.在该编码中,版权符号仅为"\ xA9".这将生成如此一些数据:"\ xA9".force_encoding('ISO-8859-1')这将证明您可以让Ruby将其转码为UTF-8:"\ xA9".force_encoding('ISO -8859-1 ').编码(' UTF-8' )
我曾经这样做过一个使用open-uri,iconv和Hpricot来抓取希腊Windows编码页面的脚本:
doc = open(DATA_URL)
doc.rewind
data = Hpricot(Iconv.conv('utf-8', "WINDOWS-1253", doc.readlines.join("\n")))
Run Code Online (Sandbox Code Playgroud)
我相信这是Ruby 1.8.7,不确定ruby 1.9的用途
| 归档时间: |
|
| 查看次数: |
64206 次 |
| 最近记录: |