将gsub()模式从ruby 1.8转换为2.0

时间:2013-09-23 23:59:53

标签: ruby regex unicode gsub

我有一个ruby程序,我正在尝试将ruby 1.8升级到ruby 2.0.0-p247。

这在1.8.7中运行得很好:

 begin
   ARGF.each do |line|
     # a collection of pecluliarlities, appended as they appear in data
     line.gsub!("\x92", "'")
     line.gsub!("\x96", "-")
     puts line
   end
 rescue => e
   $stderr << "exception on line #{$.}:\n"
   $stderr << "#{e.message}:\n"
   $stderr << @line
 end

但是在ruby 2.0下,当遇到96或92编码到一个数据文件中时,这会产生这种情况,否则该数据包含似乎是ASCII的内容:

 invalid byte sequence in UTF-8

我尝试了各种各样的方法:双反斜杠,使用正则表达式对象而不是字符串,force_encoding()等等,并且我很难过。

任何人都可以为我填写丢失的拼图吗?

感谢。

===============补充:2013-09-25 ============

将\ x92更改为\ u2019无法解决问题。

程序在输入文件中实际命中92或96之前不会出错,所以当有数十万行输入数据时,我对如何解决字符串中的字符模式感到困惑。与事件匹配,没有事故。

1 个答案:

答案 0 :(得分:2)

正是抛出异常的正则表达式,它是Ruby编译器。 \x92\x96是如何在windows-1252编码中表示的,但Ruby希望字符串是UTF-8编码的。您需要摆脱将\x92等原始字节值放入字符串文字中的习惯。非ASCII字符应由Unicode转义序列指定(在本例中为\u2019\u2013)。

现在这是一个Unicode世界,不再以字节为单位思考文本,而是用字符来思考。