重构 Iconv Code Review

Saito · 2011年11月28日 · 最后由 ahtest 回复于 2013年03月22日 · 4951 次阅读
require 'iconv'
require 'rchardet19'

def encode(string)
  cd = CharDet.detect(string)
  if cd.confidence > 0.6
    string = Iconv.conv("UTF-8//IGNORE", "#{cd.encoding}//IGNORE", string)
  end
  string.force_encoding("utf-8")
end

或者说能不能生效? 如果不能,问题在哪里?

require 'rchardet19'

def encode(string)
  cd = CharDet.detect(string)
  if cd.confidence > 0.6
    string.force_encoding(cd.encoding)
  end
  string.encode("utf-8", :undef => :replace, :replace => "?", :invalid => :replace)
end

#1 楼 @hooopo 话说之前 ruby19 准备用 string.encode. 发现不能 ignore. 原来可以用参数解决. 我试试.

#1 楼 @hooopo 看来这个先后顺序被我搞混了,虽然探测到是 gb2312 之类的,但是实际上它本身还是 ascii 字符序列.所以先 force_encoding 再 conv 才是正确的顺序.

thx @hoooooooooopo 大神.

我觉得大家都在误用 force encoding 呀 force encoding 只改变字符的编码标记,并不真正改变字符的编码 encode 才改变编码,但是必须知道本来是什么编码

+1..我开始的理解是有误的.

@hooopo 话说有木有什么转码的最佳实践? 或者在 rubyeye 写一篇?

#7 楼 @hooopo 发现一个严重的问题,code converter not found (EUC-TW to UTF-8).

#9 楼 @hooopo 话说 rubyeye 的代码高亮字体的颜色对我等色弱患者实在不够友好啊,很难看得清楚,比如现在 #00D 跟 黑色的背景搭配,我完全无法清晰地区分。。

#10 楼 @Psi 好吧 我的 css 水平很差。。有时间可以帮忙改下哈:-)

#9 楼 @hooopo rubyeye 还要登录? 应该用 disqus 回复系统吧... 好吧,我想说的是: 内外编码一般有什么作用?

#12 楼 @Saito 内外编码是针对 IO 的,你从 IO 读取数据的时候是没有设置编码标记的,外编码负责给读来的字符 tag 一个 encoding 内编码负责把读来的字符转换

1.9 以后新的规则就是: 1.源文件加 magick comment 2.IO 声明内外编码

#13 楼 @hooopo oh~ got it.. Thx.. .

#14 楼 @Saito 这里有史上最全的 关于 ruby 编码的博客,看了两天才看完... http://blog.grayproductions.net/articles/understanding_m17n

顶楼上,快被 ruby 编码问题搞残了

#8 楼 @Saito code converter not found (EUC-TW to UTF-8). 这个问题是怎么解决的?

感谢 #4 楼 @hooopo 太感谢你啦...

需要 登录 后方可回复, 如果你还没有账号请 注册新账号