我刚学 ruby,最近遇到个问题不懂,想请教下各位: 有一个 UTF-8 编码的 txt 文件,读取文件的每一行并通过 split 函数将分割,但显示错误: in 'split':invalid byte sequence in GBK(argumenterror)
PS:已经将 ruby 对字符串的编码方式设为 GBK
你要 ruby 处理 GBK 编码的字符串,却喂给它 UTF-8,它会觉得你在坑它。
我认为是这样:
就像处理时间换算这样的场景,统一将时间先转换程 utc,然后在进行换算。同理,处理任何文本文件之前,现将文件的字符编码转成 utf-8,然后这个世界一下子变得美好了一点点。
#5 楼 @413472212 因为你用 gbk 去读呀,就像你跟一个美国人说汉语,他会当你在说英语,但其实他不能理解你说了啥 (invalid byte sequence)
#1 楼 @zhangyuan 简化代码如下:
a.each do |line|
line.split(' ').each do |word|
#do something
end
end
#encoding: GBK
a = File.open("word.txt") #通过另存为知道文件是UTF-8编码
a.each do |line|
line.split(' ').each do |word|
#do something
end
end
#8 楼 @413472212 简单地说,就是首先将要处理的文本文件的字符编码转换成 UTF-8,然后再用 ruby 去读取并 split 操作。
转换的方法有很多,可以通过 ruby 的库,也可以直接用命令行工具,比如 iconv
$ iconv -f GBK -t UTF-8 input.txt > output.txt
pure ruby 的解决方案是rchardet19
.在gitlabhq项目的试用情况的话,很不理想。
之后就转用charlock_holmes
了。这个依赖一个 c 库 libicu-dev. 效果比 rchardet19 好一些了。但是达不到完美。但是也就只能这样了~
供参考:
#encoding: UTF-8
File.open(STAT_FILE, :encoding => 'utf-8').each_line do |line|
puts line.strip.split("\t")
en