【问题标题】:Converting gsub() pattern from ruby 1.8 to 2.0将 gsub() 模式从 ruby​​ 1.8 转换为 2.0
【发布时间】:2013-09-29 00:47:26
【问题描述】:

我有一个 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 时,这会导致异常:

 invalid byte sequence in UTF-8

我已经尝试过各种方法:双反斜杠、使用正则表达式对象而不是字符串、force_encoding() 等,我被难住了。

谁能帮我补上缺失的拼图?

谢谢。

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

将 \x92 更改为 \u2019 并不能解决问题。

程序在输入文件中实际达到 92 或 96 之前不会出错,所以当有数十万行输入数据与模式匹配而不会发生意外。

【问题讨论】:

    标签: ruby regex unicode gsub


    【解决方案1】:

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

    现在是 Unicode 世界,停止以字节为单位考虑文本,而是以字符为单位考虑。

    【讨论】:

    • 感谢您的快速回答。顺便说一句,你怎么知道 \x92 映射到 \u2019?
    • 漫长而痛苦的经历。 ;) 对于特定的翻译,我通常使用 Windows 的字符映射小程序或像 this one 这样的编码图表。
    • 如果我要 force_encoding('windows-1252') 怎么办?这会让我的 \xXZX 模式继续工作吗?
    • 你的意思是,作为权宜之计? :D 我不做 Ruby,但这应该可以。查看this Q/A 了解其他一些选项。
    • 少作为权宜之计,多作为“需要更少的代码更改”。整个这很愚蠢。该文件将在同一行包含 ASCII 连字符和 x96es。叹。我将在您链接的 q/a 中查看这些建议。非常感谢。我想我现在有一个桨。
    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多