将非ASCII字符从ASCII-8BIT转换为UTF-8

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)

  • 这可能会导致"UTF-8中的无效字节序列"错误.我建议你改用`encode('UTF-8')`. (6认同)

Jas*_*iss 28

有两种可能性:

  1. 输入数据已经是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并获得所需的结果.

  2. 输入数据采用其他编码方式,您需要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' )


Ach*_*les 6

我曾经这样做过一个使用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的用途