如何在Ruby中匹配中文单词?

use*_*267 3 ruby regex encoding chinese-locale

我想匹配字符串中的中文单词,但失败了

\n\n
irb(main):016:0> "\xe8\xba\xab\xe9\xab\x98455478".scan(/\\p{Han}/)\nSyntaxError: (irb):16: invalid character property name {Han}: /\\p{Han}/\n    from C:/Program Files/Ruby-2.1.0/bin/irb.bat:18:in `<main>\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

它出什么问题了?

\n\n

问题很奇怪,难道是字符编码的问题?

\n

Yu *_*Hao 5

我可以在 irb 中重现该问题。我的 Ruby 环境与其他无法重现该问题的环境之间的区别在于,我在 irb 中的编码默认GBK为中文。

\n\n

这可以重现该问题:

\n\n
#encoding:GBK\np "\xe8\xba\xab\xe9\xab\x98455478".scan(/\\p{Han}/)\n
Run Code Online (Sandbox Code Playgroud)\n\n

显示错误:invalid character property name {Han}: /\\p{Han}/

\n\n

要解决此问题,请使用 UTF-8 编码:

\n\n
#encoding:utf-8\np "\xe8\xba\xab\xe9\xab\x98455478".scan(/\\p{Han}/)\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:["\\u8EAB", "\\u9AD8"]

\n\n
\n\n

正如 @Stefan 所建议的,要将 irb 设置为使用 UTF-8 编码,请使用 启动 irb irb -E UTF-8

\n\n

要对这一字符串进行编码,请使用String#encode

\n\n
\'\xe8\xba\xab\xe9\xab\x98455478\'.encode(\'utf-8\').scan(/\\p{Han}/u)\n#=> ["\\u8EAB", "\\u9AD8"]\n
Run Code Online (Sandbox Code Playgroud)\n