加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么Iconv在irb和Ruby解释器中的工作方式不同?

发布时间:2020-12-17 02:16:37 所属栏目:百科 来源:网络整理
导读:我必须将éáéíóúàéíóú等拉丁字母转换成类似的字符串,不带特殊的重音或有线符号: é - eè - e? - A 我有一个名为“test.rb”的文件: require 'iconv'puts Iconv.iconv("ASCII//translit","utf-8",'è').join 当我将这些行粘贴到irb中时,它会工作
我必须将éáéíóúàéíóú等拉丁字母转换成类似的字符串,不带特殊的重音或有线符号:

é -> e
è -> e
? -> A

我有一个名为“test.rb”的文件:

require 'iconv'

puts Iconv.iconv("ASCII//translit","utf-8",'è').join

当我将这些行粘贴到irb中时,它会工作,按预期返回“e”.

运行:

$ruby test.rb

我得到“?”作为输出.

我正在使用irb 0.9.5(05/04/13)和Ruby 1.8.7(2011-06-30 patchlevel 352)[i386-linux].

解决方法

Ruby 1.8.7不是像1.9那样的多字节字符精明.通常,它将字符串视为一系列字节而不是字符.如果您需要更好地处理此类字符,请考虑升级到1.9.

James Gray有一个关于在Ruby 1.8中处理多字节字符的series of articles.我强烈建议花时间阅读它们.这是一个复杂的主题,所以你想读他几次写的整个系列.

此外,1.8编码支持需要$KCODE标志集:

$KCODE = "U"

所以你需要将它添加到1.8中运行的代码中.

这是一些示例代码:

#encoding: UTF-8

require 'rubygems'
require 'iconv'

chars = "éáéíóúàéíóú"

puts Iconv.iconv("ASCII//translit",chars)

puts chars.split('')
puts chars.split('').join

使用ruby 1.8.7(2011-06-30 patchlevel 352)[x86_64-darwin10.7.0]并在IRB中运行它,我得到:

1.8.7 :001 > #encoding: UTF-8
1.8.7 :002 >   
1.8.7 :003 >   require 'iconv'
true
1.8.7 :004 > 
1.8.7 :005 >   chars = "303251303241303251303255303263303272303200303211303215303223303232"
"303251303241303251303255303263303272303200303211303215303223303232"
1.8.7 :006 > 
1.8.7 :007 >   puts Iconv.iconv("ASCII//translit",chars)
'e'a'e'i'o'u`A'E'I'O'U
nil
1.8.7 :008 > 
1.8.7 :009 >   puts chars.split('')
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
nil
1.8.7 :010 > puts chars.split('').join
éáéíóúàéíóú

在输出的第9行,我告诉Ruby将这条线分成它的字符概念,在1.8.7中是字节.所结果的 ‘?’意味着它不知道如何处理输出.第10行我告诉它要拆分,这会产生一个字节数组,然后重新组合成普通字符串,允许多字节字符正常转换.

使用Ruby 1.9.2运行相同的代码显示了更好,更期望和更理想的行为:

1.9.2p290 :001 > #encoding: UTF-8
1.9.2p290 :002 >   
1.9.2p290 :003 >   require 'iconv'
true
1.9.2p290 :004 > 
1.9.2p290 :005 >   chars = "éáéíóúàéíóú"
"éáéíóúàéíóú"
1.9.2p290 :006 > 
1.9.2p290 :007 >   puts Iconv.iconv("ASCII//translit",chars)
'e'a'e'i'o'u`A'E'I'O'U
nil
1.9.2p290 :008 > 
1.9.2p290 :009 >   puts chars.split('')
é
á
é
í
ó
ú
à
é
í
ó
ú
nil
1.9.2p290 :010 > puts chars.split('').join
éáéíóúàéíóú

Ruby通过split(”)维护了字符的多字节.

请注意,在这两种情况下,Iconv.iconv做了正确的事情,它创建了与输入字符在视觉上相似的字符.虽然主要的撇号看起来不合适,但它提醒人们最初对这些角色进行了重音.

有关更多信息,请参阅相关问题右侧的链接或尝试this SO search [ruby] [iconv]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读