utf-8下匹配中文字符

4e00 到 9fa5 是 UTF-16 的 …… 而且不能匹配一些生僻汉字。 
Ruby 1.9 比较好办,但是 1.8.6 目前用得最广泛,下面给几个 1.8 下面的解决方案。 

方案一:匹配 UTF-16 

先准备待测字符串 s。 

如果在编码为 utf-8 的源文件中 

Ruby代码 
  1. require 'iconv'  
  2. s = Iconv.conv 'utf-16be''utf-8'"测试"  

如果在 windows 控制台下
Ruby代码 
  1. require 'iconv'  
  2. s = Iconv.conv 'utf-16be''gbk'"测试"  


注意一个汉字是两字节,所以把正则改写成: 
Ruby代码 
  1. /^(?:[/x4e-/x9e][/x00-/xff]|/x9f[/x00-/xa5])+$/n =~ s  



方案二:匹配 utf-8 
UTF-8 是 UTF-16 插入一些东西弄成的: 
1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 

所以汉字码点是从 e4b880 到 e9bea5,写成正则就是 4 段…… 
/xe4[/xb8-/xbf][/x80-/xbf] 
[/xe5-/xe8][/x80-/xbf][/x80-/xbf] 
/xe9[/x80-/xbd][/x80-/xbf] 
/xe9/xbe[/x80-/xa5] 

结论,先保证字符串 s 的编码是 UTF-8 (在 rails 应用中一般全部都默认是 UTF-8),然后 
Ruby代码 
  1. /^(?:/xe4[/xb8-/xbf][/x80-/xbf]|[/xe5-/xe8][/x80-/xbf][/x80-/xbf]|/xe9[/x80-/xbd][/x80-/xbf]|/xe9/xbe[/x80-/xa5])+$/n =~ s  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值