2

当记录包含多字节字符时,我在使用 Mongoid 在 MongoDB 中保存记录时遇到问题。这是字符串:

a="Chris \xA5\xEB\xAE\xDFe\xA5"

我首先将其转换为 BINARY,然后gsub像这样:

a.force_encoding("BINARY").gsub(0xA5.chr,"oo")

...效果很好:

=> "Chris oo\xEB\xAE\xDFeoo"

但如果我使用,我似乎无法使用该chr方法Regexp

a.force_encoding("BINARY").gsub(/0x....?/.chr,"")
NoMethodError: undefined method `chr' for /0x....?/:Regexp

有同样问题的人吗?

非常感谢...

4

2 回答 2

6

你可以用插值来做到这一点

a.force_encoding("BINARY").gsub(/#{0xA5.chr}/,"") 

"Chris \xEB\xAE\xDFe"

编辑:根据评论,这里有一个将二进制编码字符串转换为 ascii 表示并对该字符串执行正则表达式的版本

a.unpack('A*').to_s.gsub(/\\x[A-F0-9]{2}/,"")[2..-3] #=>"Chris "

末尾的 [2..-3] 是去掉开头的 [" 和尾随的 "]

注意:要摆脱特殊字符,您也可以使用

a.gsub(/\W/,"") #=> "Chris"
于 2012-06-12T11:11:30.463 回答
4

实际的字符串不包含文字字符 \xA5:这就是向您显示原本无法打印的字符的方式(类似于当字符串包含换行符时,ruby 会向您显示 \n)。

如果你想改变任何非 ascii 的东西,你可以这样做

a="Chris \xA5\xEB\xAE\xDFe\xA5"
a.force_encoding('BINARY').encode('ASCII', :invalid => :replace, :undef => :replace, :replace => 'oo')

首先将字符串强制为二进制编码(您总是希望从字节对其编码有效的字符串开始。二进制始终有效,因为它可以包含任意字节)。然后它将其转换为 ASCII。通常这会引发错误,因为它不知道如何处理某些字符,但是我们传递的额外选项告诉它用字符 'oo' 替换无效/未定义的序列

于 2012-06-14T11:20:13.883 回答