中国語には「ピンイン」と呼ばれる発音に似たものがあります。
日本語を 50 音順で並べるのと同じように、中国語ではピンイン順に並べられていると気持ちが良いようです。
今回はそのピンインソートを chinese_pinyin という gem を利用して実現してみたいと思います。
(Ruby Toolbox で検索してみると chinese_pinyin がダントツ人気でした。)
ピンインソートはこんな感じで簡単に実現できます。
pinyin.rb
require 'chinese_pinyin'
array = ["北京", "西安", "香港", "上海", "昆明", "日本"]
array.sort! do |a,b|
Pinyin.t(a, splitter: "") <=> Pinyin.t(b, splitter: "")
end
p array # =>["北京", "昆明", "日本", "上海", "西安", "香港"]
どういうピンインで構成されているかを知りたい場合はこんな感じ。
pinyin.rb
require 'chinese_pinyin'
array = ["北京", "西安", "香港", "上海", "昆明", "日本"]
p array.map {|a| Pinyin.t(a, splitter: "")} # =>["beijing", "xian", "xianggang", "shanghai", "kunming", "riben"]
もう1つ、こちらの gem がイケてる点として、ピンインを置換する拡張ポイントが用意されていることが挙げられます。
例えば「my_pinyin.txt」のような定義ファイルを用意して「WORDS_FILE=my_pinyin.txt」のような環境変数を設定すると、そのピンインを置換することが出来ます。
my_pinyin.txt
日本|nihon
香港|hongkong
pinyin.rb
require 'chinese_pinyin'
array = ["北京", "西安", "香港", "上海", "昆明", "日本"]
p array.map {|a| Pinyin.t(a, splitter: "")} # =>["beijing", "xian", "hongkong", "shanghai", "kunming", "nihon"]
なかなか素晴らしい gem だと思います。