Ruby 正则表达式的 match 遇到中文时出现 “invalid byte sequence in GBK” 问题

mrlaoba · 2013年09月20日 · 最后由 chanshunli 回复于 2014年03月25日 · 6997 次阅读

用自己写的一个正则表达式逐行匹配一个文件的内容的时,遇到中文就跳出错误:

test.rb:8:in `match': invalid byte sequence in GBK (ArgumentError)
        from test.rb:8:in `block in <main>'
        from test.rb:6:in `each'
        from test.rb:6:in `<main>'

试过在代码文件第一行中加入:# -- coding:utf-8 -- 也试过 ruby 命令上加上:--encoding=utf-8 不能解决问题。想问下大家问题出在哪?怎么解决该问题。(刚开始学 ruby,大神们勿喷)

程序:

reg_ct = /create table ([a-z_]+)/
fr = "crebas.sql"
file = File.new(fr)
file.each do |line|
    #puts line
    if reg_ct.match(line)
        puts line
    else
        puts line
    end
end
file.close

环境: OS:win7 ruby: Ruby1.9.3

先将文件内容转换 -> utf-8,然后再处理。详见:http://ruby-china.org/topics/1223

#1 楼 @nightire 谢谢 nightire 的回答。昨天试了下在 match 前添加下面代码解决了问题。

line.force_encoding("UTF-8")

然后又试了下你给的方法。读文件时使用下面代码:

file = File.new(fr).tap{|f| f.set_encoding 'utf-8','GBK'}

后来观察发现我的文件的编码方式是 UTF8 的,也就是外编码(external encoding)是 UTF8,读进来后的内编码(internal encoding)是 GBK 的。match 把一个 UTF8 的字节流当成 GBK 去处理,然后问题就出现了。

line.force_encoding("UTF-8")   #是修改内编码为UTF8
set_encoding 'utf-8','GBK     #是将字节流转换成GBK格式的(外编码仍为UTF8)
匿名 #4 2014年03月25日

C:\Users\Administrator\blog>gem install mime-types -v '1.25.1' ERROR: While executing gem ... (ArgumentError) invalid byte sequence in GBK 请问这是在那里改?谢谢!

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