Z jakiegoś powodu we wszystkich loci unikodowych testowałem, w kilku różnych wersjach glibc, strcoll() zwraca zero dla dowolnych dwóch hiraganas. To łamie sortowania uniq i wszystko, co w jakiś sposób współdziała z kolejnością łańcuchów.
$ echo -e -n 'い \ n ろ \ n は \ n に \ n ほ \ n へ \ n と \ n' | sortuj uniq
い
który jest po prostu uszkodzony nie do naprawienia. Ludzie z różnych stron świata mogą mieć różne pomysły na to, czy "い" powinno być umieszczone przed lub po "ろ", ale nikt rozsądny nie uznałby ich za takiego samego.
I nie, ustawiania locale do japońskiego jednego nie ma znaczenia:
$ LC_ALL = ja_JP.utf8 LANG = ja_JP.utf8 LC_COLLATE = ja_JP.utf8 echo -e -n 'い \ n ろ \ n は \ n に \ n ほ \ n へ \ n と \ n' | sortuj uniq
い
Była dyskusja w jakiejś oficjalnej liście mailingowej, ale wiecie co, to było w 2002 roku i nigdy nie została ustalona, ponieważ ludzie nie obchodzi: https://www.mail-archive.com/[email protected]/msg02658.html
To bug stało nas w jeden dzień i na końcu naszym jedynym wyjściem było ustawienie locale sortowania na "C" i poleganie na ładnych właściwościach kodowania utf-8. To straszne doświadczenie, ponieważ nie powinno się pracować w locale "C" podczas przetwarzania danych w całości po japońsku.
Tak więc ze względu na zdrowie psychiczne NIE używaj bezpośrednio strcoll. Bezpieczniejsze wariant może być:
int safe_strcoll(const char *a, const char *b)
{
int ret = strcoll(a, b);
if (ret != 0) return ret;
return strcmp(a, b);
}
tylko w przypadku strcoll() decyduje się wkręcić cię ...
Sieć [przykład tutaj] (http://en.cppreference.com/w/cpp/string/byte/strcoll) wydaje mi się całkiem jasne. – Rapptz
@Rapptz ... Ups ... powinienem widzieć ten link .... przed opublikowaniem ... – Recker
hrnec przed chrt :) +1 – davak