我想在一个字符串中匹配中文单词,但它失败了
irb(main):016:0> "身高455478".scan(/\p{Han}/)
SyntaxError: (irb):16: invalid character property name {Han}: /\p{Han}/
from C:/Program Files/Ruby-2.1.0/bin/irb.bat:18:in `<main>'
它出了什么问题?
问题很奇怪,是字符编码问题吗?
答案 0 :(得分:4)
我可以在irb中重现这个问题。我的Ruby环境与无法重现问题的其他环境之间的区别在于,我在irb中的编码默认为GBK
,适用于中文。
这可以重现问题:
#encoding:GBK
p "身高455478".scan(/\p{Han}/)
显示错误:invalid character property name {Han}: /\p{Han}/
要解决此问题,请使用UTF-8编码:
#encoding:utf-8
p "身高455478".scan(/\p{Han}/)
输出:["\u8EAB", "\u9AD8"]
正如@Stefan建议的那样,要将irb设置为使用UTF-8编码,请使用irb -E UTF-8
启动irb。
要对这一个字符串进行编码,请使用String#encode:
'身高455478'.encode('utf-8').scan(/\p{Han}/u)
#=> ["\u8EAB", "\u9AD8"]