繁体   English   中英

如何使用gsub替换ruby中的多字节字符?

[英]How to replace multibyte characters in ruby using gsub?

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

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

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

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

......工作正常:

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

但是如果我使用Regexp ,似乎我不能使用chr方法:

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

有同样问题的人吗?

非常感谢...

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

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"

实际字符串不包含文字字符\\ xA5:这就是如何向您显示否则将无法打印的字符(类似于字符串包含换行符ruby时显示的情况)。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM