日本語文字列ファイルを日本人としてソートする sort order

実験中です。

日本語文字列ファイルを日本人に違和感のない形でソートするために週末潰しました。
工程は、漢数字、ひらがな、カタカナのオーダーを恣意的にいじってみた段階です。準備作業として数値参照と実体のそれとの相互の変換スクリプトをPerlで作ったりした時間が90%(16進表記を変換したことがなかったので、そこから調べた。熟練ユーザーなら10分位でできちゃうと思います)。

表意文字を使っている僕たちですが、EUCやShiftJISの順番では使いにくい人も少なくないと思います。別に、ユニコードなどが表意文字に敬意を払ってないのはケシカランというつもりはないです。


[かなチーム]>〇 >一>二>三>四>五>六>七>八>九>[漢字その他チーム]

と評価されるようになっています。やりながら後追いで文献調べてこの手順でいいはずだなんて検査をしていました。一日触ってみて予想外に快適なので、表意文字のうち、漢数字以外の上、下などを変えます。ファイル名に使う文字で一般的に、位置関係を示す文字でやりすぎない程度にするには何が適切かを考えています。


$ export LANG="ja_JP.UTF-8" ;ls 試作段階での並び、表意文字の通り(改訂ja_JP)
一  二  三  四  五  六  七  八  九  十

$ export LANG="ja_JA.UTF-8" ;ls デフォルトはShiftJIS/EUC-JPと同じ。素敵な並び
一  九  五  三  四  七  十  二  八  六 

※ ja_JAロケール(内容はデフォルトja_JPと同じ)は作業の便宜上コンパイルしたものです。そんなもんありません。末尾に生成に用いたコマンド記してます。

WindowsやMAC OS Xを利用していても困惑する、漢数字まじりの問題はたとえばこんなかんじでしょうか。一般的な回避方法は知っていても気持ち悪いのは致し方ありませんね。
※作品世界では算用数字の9課ですが、たとえばこんなかんじ。 一太郎、三香子、二郎でもいいし、二頭身、九頭身とか、でもいいけれど。会社の部局などで、漢字が正規表記という場合もあります。アラビア数字でいいじゃん?! 自社ならいざ知らず、他社あて文書でそれをやってはまずいですね。たぶん。
$ export LANG="ja_JA.UTF-8" ;ls
公安一課  公安九課  公安五課  公安三課  公安四課  公安七課  公安二課  公安八課  公安六課

$ export LANG="ja_JP.UTF-8" ;ls
公安一課  公安二課  公安三課  公安四課  公安五課  公安六課  公安七課  公安八課  公安九課

初期変更

並び=ソートを画像で示すような状態にしました。まだテストなのですが、長年の鬱憤とおさらばできるかも。コマンドラインでも同等です。コマンドラインのsort Programでも同じです。

nemo


リストは、Wikipediaの2010年代アニメ一覧ページから「ががー」と生成。2015年まで。
このソートを見て不自然さを感じない人が多ければ嬉しいです。当たり前だと思うのが普通の気もしないではないですが。どうなんでしょう。エンティティは処理していませんのでガルパンがあれか。

ちなみに、caja でも同じです。nautilusでも同じでしょう。

作業メモ

http://archive.linux.or.jp/JF/JFdocs/Japanese-Locale-Policy.txt 1999年12月15日 1.03
というのがありますが、現在の世界は実質UTF-8なディストリビューションで溢れている中、EUC基準で書かれているので、過去の遺物なんでしょうか?! 最新がどこかにあるのでしょうかね?!

4.2. LC_COLLATE

当面、文字の照合順序は文字コードの順番とする。

各文字コードは次の順序とする。

 1. ISO 646 IRV

 2. JIS X 0201 カタカナ

 3. JIS X 0208

 4. JIS X 0212

この項目は実装の進行状況に合わせてより実用的なものへと改訂される予定で
ある。
※下線強調は筆者。
とあります。みつけたこのファイルの時点(日本語ロケールはEUC推奨)でも、実用的なものへの改訂可能性は伺われます。いや、何がいいたいかというと、そのままだっただけってことかなと。他国・他言語のロケールを調べてみても、固定する必要はないってことがわかりました。 ドイツの憲法改正数と日本のそれを比較するとわかりやすいかも。だめではないが固定されている世界。(是非など私見はおいておいて)

とりたてて、偉い人たちが崇高な理念の元に決めたりしているわけではなさそうなので、ほっとします。この時期までの慣例的な定義が今も残っているだけじゃないかと。

http://manpages.ubuntu.com/manpages/precise/man8/locale-gen.8.html
SEE ALSOlocale(1), localedef(1), locale(5), locale.gen(5), locale(7)

やっていること、やったこと


COLLATEの定義がそのままではわたしの脳味噌では読めないので、19000字?!だし。
・数値参照を実体文字(ふつうに読める文字)になるスクリプトを書いた。
・ 上のリバーススクリプトを同時に作成した。
・評価順をテスト想定通りにした定義を作成した。反映させた。確認してみた。

余談:i18n,l10n

echo 'internationalization' | perl -pe '$nagasa=(length $_) -3 ; print ($nagasa);print "字 :: " '
で改行除外して、たしかに18文字か。長いです。
echo 'localization' | perl -pe '$nagasa=(length $_) -3 ; print ($nagasa);print "字 :: " '10字 :: localization
Hamletの名セリフなら、
39字 :: To be or not to be, that is the question. T39n.

参考


任意のロケールをシステムに認知させるには、ロケールファイルを設定してコンパイルします。フォーマットにミスがあると構文エラーがでます。重複もチェックしてくれます。 「ja_JA.UTF-8」がオリジナルのja_JPです。切り替えて検査するために作っています。
sudo locale-gen ja_JA.UTF-8
Generating locales (this might take a while)...
  ja_JA.UTF-8... done
Generation complete.

sudo dpkg-reconfigure locales
Generating locales (this might take a while)...
  en_AG.UTF-8... done
  en_AU.UTF-8... done
  en_BW.UTF-8... done
  en_CA.UTF-8... done
  en_DK.UTF-8... done
  en_GB.UTF-8... done
  en_HK.UTF-8... done
  en_IE.UTF-8... done
  en_IN.UTF-8... done
  en_NG.UTF-8... done
  en_NZ.UTF-8... done
  en_PH.UTF-8... done
  en_SG.UTF-8... done
  en_US.UTF-8... done
  en_ZA.UTF-8... done
  en_ZM.UTF-8... done
  en_ZW.UTF-8... done
  ja_JA.UTF-8... done
  ja_JP.UTF-8... done
Generation complete.

全部のロケール生成をしてみようなんて考えるとけっこう時間がかかりますし、おそらく使うことのない余計なファイルが生成されますのでご注意を。 だいたい340個ぐらい。intel i3クラスで540秒位もかかります。