【问题标题】:Ruby Regex Error: incompatible encoding regexp match (ASCII-8BIT regexp with UTF-8 string)Ruby 正则表达式错误:不兼容的编码正则表达式匹配(ASCII-8BIT 正则表达式与 UTF-8 字符串)
【发布时间】:2012-04-09 02:09:27
【问题描述】:

我遇到了两个错误,都与编码有关,而且都与此相关。

我在启动 WEBrick 时遇到的第一个错误(技术上是警告):

/Users/USERNAME/example/config/initializers/bb-ruby.rb:54: warning: invalid Unicode Property \P: /\:\-?\P/

它所指的行是:/\:\-?\P/,

这只是一点正则表达式,最终是这个块的一部分:

@@tags['Razzing'] = [
  /\:\-?\P/,
  '<img src="/assets/emoticons/razzing.png">',
  'Razzing',
  ':P',
  :razzing]

然后,我在解析一些字符串的时候也出现如下错误(大概是同一行所致)...

Encoding::CompatibilityError
incompatible encoding regexp match (ASCII-8BIT regexp with UTF-8 string)

我正在运行 Ruby 1.9.2 和 Rails 3.2.1。

【问题讨论】:

    标签: ruby-on-rails ruby unicode encoding character-encoding


    【解决方案1】:

    您的正则表达式正在“编译”为 ASCII-8BIT。

    只需在声明 Regex 的文件顶部添加编码声明:

    # encoding: utf-8
    

    你就完成了。现在,当 Ruby 解析您的代码时,它会假定您使用的每个文字(Regex、String 等)都以 UTF-8 编码指定。

    更新:UTF-8 现在是 Ruby 2.0 及更高版本的默认编码。

    【讨论】:

    • 这停止了 Encoding::CompatibilityError 错误,但在启动 Webrick 时我仍然收到 invalid Unicode Property 警告。
    • 在 Ruby 1.9 上更改了 Regex 引擎……我不知道你说的 \P 最初是什么意思,但现在它用于匹配 Unicode 码位,并且它需要一个参数(如 @987654327 @,匹配任何非字母字符)。见:regular-expressions.info/unicode.html
    • 我正在尝试匹配这个::-P:P(如在吐舌头的表情中)...我现在该怎么做?
    • 省略 P 前的反斜杠
    • 实际上,您的表达式不需要任何反斜杠。请记住,它仅用于转义对正则表达式有意义的字符,例如:([{(及其关闭对应项)、^$\ 本身。
    【解决方案2】:

    Ruby 2.0 Document

    /Pattern/u - stand for UTF-8
    

    【讨论】:

      猜你喜欢
      • 2020-10-30
      • 2012-12-26
      • 2017-12-18
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      相关资源
      最近更新 更多