2021/06/19(Sat)
○[Windows][I18N] 文字列照合順序
Excelのソート順の話、こういう並びになるのは「文字列照合順序(Collation)」日本語の場合だと「 JIS X 4061 日本語文字列照合順番」に従ってるからですな。 LibreOfficeもふつーにこういう並べ替えをするので、Google Spredsheetがアレというお話。 つーか自分のアカウントでGoogle Spreadsheet試したらちゃんとCollationに従ってOfficeと同じ並びしますがな、言語設定?
以前Collationについては途中まで解説を 書いてめんどくさくなってやめてしまったな、来世の俺に期待。
そっちの記事でもサンプル書いたけど、文字列照合順序についてはC言語だとstrcoll/wcscollという関数で実装されてる。
$ cat >unko.c
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int
cmp(const void *p1, const void *p2)
{
const char *s1, *s2;
s1 = *((const char **)p1);
s2 = *((const char **)p2);
return strcoll(s1, s2);
}
int
main(int argc, char **argv)
{
int i;
setlocale(LC_ALL, "");
qsort(&argv[1], argc - 1, sizeof(*argv), cmp);
for (i = 1; i < argc; ++i)
printf("%s\n", argv[i]);
}
^D
$ make unko
$ LANG=ja_JP.UTF-8 ./unko.exe 一 二 三 第
一
三
第
二
はいExcelと同じ並びになりましたな、ざっくりとした説明としては漢字の読みがなを50音順に並べてると思ってもらえればおk。
- いち(一)
- さん(三)
- だい(第)
- に(二)
論より証拠で同音混ぜてみようか。
$ LANG=ja_JP.UTF-8 ./unko.exe 一 壱 二 弐 三 参 第 大
一
壱
三
参
大
第
二
弐
ちゅうこと。
読みがなについて漢字は複数あるのでJIS X 4061では「代表読み」で丸められるのだけど、Excelにふりがなデータ与えるとそっち優先してくれるみたいね。
ちなみにWindows 10のスタートメニューだとおそらくMS-IMEの辞書から逆変換した結果を元に並べてるっぽいってのはこれも ちょっと前の記事で書いた通り。