学习 ruby 有两个月,这门语言确实不错,让我思路开拓不少。只是在目前国内用的人太少,碰到很多小问题都得上外网站找,但编码问题困扰了我很久,一直没找到什么好的解决办法。编码问题应该是很常见的任务了,所以想知道大家的解决方案。下面也给出了我写的代码,希望能够抛砖引玉。还有很多不懂的地方,请多多指教
我想要程序能够自动判断文件的编码(主要是 shift-jis , gbk 和 utf-8 with bom 这几种),然后统一转换为 utf-8 无 bom 格式
String 类虽然有 force_encoding 和 valid_encoding?方法,但准确性很低,所以 现在的做法是尝试转换每一种编码,直到成功为止再进行处理。就目前用过的几次来看,成功率还不算太低,所以就没用 iconv 了。代码在最下面,也可看这里 https://gist.github.com/1380350
另外还有两个小问题
ruby 里除了 open 方法外,大多文件操作时候都不会帮你处理好系统编码的问题。每次都是先转成 gbk 再转 转回来。不知道有没有现成的 gem 解决这个问题
似乎传递给 Dir.glob 的路径里包含“[”和”]”就找不到路径了,这是 bug 吗?我现在只能用?代替这两个字符
# 运行环境 win7, ruby 1.9.2 p290
def txt_to_utf(file)
open(file) do |f|
s = f.read
#shift_jis 必须写在前面,因为被误判为gbk的概率很高
x = %w(shift_jis gbk big5)
begin
u = s.dup.encode("utf-8",x.shift)
rescue Encoding::UndefinedConversionError,Encoding::InvalidByteSequenceError => ex
if x.empty?
if s.chr.ord.to_s(16) == "efbb"
#处理utf-8 with bom 文件
end
else
retry
end
else
#处理 shift-jis, gbk, big5 文件
end
end
end