Ruby 中文、Unicode处理上的问题一例

作者:半瓶墨水   链接:http://www.2maomao.com/blog/ruby-unicode-chinese-char-example/

纯代码

下载: test.rb
def test_u16_pattern_match
      
line = "我们来测试一下"
      
assert_match(/测试/, line) #Aha, this should match
      
assert_match(/抢床/, line) #Wierd, isn't it? It acutally matches
      
pattern = "测试"
      
foo = "抢床"
      
u16_pattern = Iconv.new("UTF-16", "GBK").iconv(pattern)
      
u16_foo     = Iconv.new("UTF-16", "GBK").iconv(foo)
      
u16_line    = Iconv.new("UTF-16", "GBK").iconv(line)
 
      
assert_match(u16_pattern[2, u16_pattern.size - 2], u16_line)
      
assert_no_match(/#{u16_foo[2, u16_foo.size - 2]}/, u16_line)
  
end

附上几个链接:
  日语字符的处理
  Ruby中unicode编码问题
  Ruby的Substring问题,如果是中文的,可能会有问题
  ruby/rails中的中文处理(1)
  [问题]truncate中文

再附个小问题
  到底如何优雅的删除一个字符串前面的若干字符?或者说从某个位置开始向后取子串?
  u16_pattern[2, u16_pattern.size – 2]这种写法像是掐了脖子吐痰,又长又恶心

标签:[tag]Ruby, Unicode, 中文[/tag]

5 条评论 发表在“Ruby 中文、Unicode处理上的问题一例”上

  1. pluskid说道:

    assert_no_match(/抢床/u, line)

    这样应该就可以了吧?Ruby 1.8 及以前的版本确实对 Unicode 支持很烂,不过现在 1.9 出来了,就好很多了,希望 1.9.1 快出来,大家都赶紧 port 到 1.9 上来就好了!:)

  2. 兔毛猫说道:

    @pluskid
    升级啊,呵呵
    对小站来说,host不升级,自己升不了
    对大战来说,代码量太大,不敢升啊。

  3. kk说道:

    简单: u16_pattern[2..-1]

  4. kk说道:

    你应该看一下入门教程, 才 10 几页

  5. 半瓶墨水说道:

    @kk 同学,注意一下发文章的时间,那时候ruby还不支持u16。。。

留下回复