Monday, December 20, 2010

Abbrev for Multibyte characters

Each Ruby implementations have distinct behavior of abbrev library (in Japanese). There is a sample program:
# -*- coding: UTF-8 -*-
require 'abbrev'

puts RUBY_VERSION
result = Abbrev.abbrev(%w{あした あなた})
puts result, result.count

"あした" means "tomorrow", and "あなた" means "you". So let's run this script on Ruby 1.9(Linux), JRuby(Linux) and IronRuby(Windows).


Ruby 1.9(Linux)

> /opt/ruby-1.9.1/bin/ruby abbrev_sample.rb 
1.9.2
{"あし"=>"あした", "あな"=>"あなた", "あした"=>"あした", "あなた"=>"あなた"}
4

JRuby(Linux)

> jruby abbrev_sample.rb
1.8.7
あし��あしたあし�あしたあしあしたあな��あなたあな�あなたあなあなたあしたあしたあなたあなた
8
> jruby --1.9 abbrev_sample.rb
1.9.2dev
{"\xE3\x81\x82\xE3\x81\x97\xE3\x81"=>"\xE3\x81\x82\xE3\x81\x97\xE3\x81\x9F", "\xE3\x81\x82\xE3\x81\x97\xE3"=>"\xE3\x81\x82\xE3\x81\x97\xE3\x81\x9F", "\xE3\x81\x82\xE3\x81\x97"=>"\xE3\x81\x82\xE3\x81\x97\xE3\x81\x9F", "\xE3\x81\x82\xE3\x81\xAA\xE3\x81"=>"\xE3\x81\x82\xE3\x81\xAA\xE3\x81\x9F", "\xE3\x81\x82\xE3\x81\xAA\xE3"=>"\xE3\x81\x82\xE3\x81\xAA\xE3\x81\x9F", "\xE3\x81\x82\xE3\x81\xAA"=>"\xE3\x81\x82\xE3\x81\xAA\xE3\x81\x9F", "\xE3\x81\x82\xE3\x81\x97\xE3\x81\x9F"=>"\xE3\x81\x82\xE3\x81\x97\xE3\x81\x9F", "\xE3\x81\x82\xE3\x81\xAA\xE3\x81\x9F"=>"\xE3\x81\x82\xE3\x81\xAA\xE3\x81\x9F"}
8

IronRuby(Windows)

> "C:\Program Files\IronRuby 1.1\bin\ir.exe" abbrev_sample.rb
1.9.2
{"\u{3042}\u{3057}"=>"\u{3042}\u{3057}\u{305f}", "\u{3042}\u{3057}\u{305f}"=>"\u{3042}\u{3057}\u{305f}", "\u{3042}\u{306a}"=>"\u{3042}\u{306a}\u{305f}", "\u{3042}\u{306a}\u{305f}"=>"\u{3042}\u{306a}\u{305f}"}
puts result, result.count{"\u{3042}\u{3057}"=>"\u{3042}\u{3057}\u{305f}", "\u{3042}\u{3057}\u{305f}"=>"\u{3042}\u{3057}\u{305f}", "\u{3042}\u{306a}"=>"\u{3042}\u{306a}\u{305f}", "\u{3042}\u{306a}\u{305f}"=>"\u{3042}\u{306a}\u{305f}"}
4

Both CRuby and IronRuby deal Multibyte characters as Multibyte characters. But JRuby(either 1.8 mode or 1.9 mode) deals with Multibyte characters as Unicode each bytes.

No comments:

Post a Comment