作者: Bruce.
日時: 2006/3/7(09:02)
Bruce.です。

FreeBSD/Mac OS X/Fedora Core 3 以外のGNU/Linux
で↓のプログラムの出力結果がどうなるか確かめてもらえませんか?

Fedora Core 3で試したら楽しいことになったんですが。
#Localeごとのキャラクタ照合順序のデータベースってどこにあるの?

#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>

#ifndef CMPFUNC
#define CMPFUNC wcscoll
#endif

int
main()
{
#define ARYNUM 5
    unsigned char *str[ARYNUM] = {
        "\xb1", /* HALFWIDTH KATAKANA LETTER A in SJIS */
        "\xb2", /* HALFWIDTH KATAKANA LETTER I in SJIS */
        "\xb3", /* HALFWIDTH KATAKANA LETTER U in SJIS */
        "\xb4", /* HALFWIDTH KATAKANA LETTER E in SJIS */
        "\xb5", /* HALFWIDTH KATAKANA LETTER O in SJIS */
    };
    wchar_t *wstr[ARYNUM];
    int i;

#ifndef _WIN32
    setlocale(LC_ALL, "ja_JP.SJIS");
#else
    setlocale(LC_ALL, "japanese.japan");
#endif

    for (i=0; i<ARYNUM; i++)
	wstr[i]=calloc(sizeof (wchar_t)*2, 1);

    for (i=0; i<ARYNUM; i++)
        mbrtowc(wstr[i], str[i], strlen(str[i]), NULL);

    printf("before sort\n");
    for (i=0; i<ARYNUM; i++)
        printf("%x\n", wstr[i][0]);

    qsort(wstr, ARYNUM, sizeof (wchar_t*), (int (*)(const void*, const
void*))CMPFUNC);

    printf("\nafter sort\n");
    for (i=0; i<ARYNUM; i++)
        printf("%x\n", wstr[i][0]);

    return 0;
}

いじょ。