I know I believe in nothing but it is my sweet nothing.:2021年06月19日分

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の辞書から逆変換した結果を元に並べてるっぽいってのはこれも ちょっと前の記事で書いた通り。