2015-05-30 3 views
0

Рассмотрим этот код:wcscoll возвращает другой результат, чем ожидалось

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

int main(void) { 
    setlocale(LC_ALL, "pl_PL.UTF-8"); 
    printf("%d\n", wcscoll(L"ą", L"b")); 
    return 0; 
} 

Выход на

158 

Но я бы ожидать, что это будет -1, поскольку это как раз перед Ь в польском алфавите , Почему он вернулся? И если не так, как можно сравнивать слова в алфавитном порядке?

+0

Является ли местный язык польского языка на вашей машине? Утилита 'sort' правильно сортируется с этой локалью? Первый шаг в отладке такого рода - всегда проверять стандартные возвращаемые значения библиотеки, в этом случае 'if (setlocale (...) = NULL) ...' – rici

+0

@rici нет, на самом деле это не так. Итак, я думаю, что это зависит от ОС? – Dunno

+0

Нет, это вопрос о том, какие локали вы установили на машине. Таким образом, он больше зависит от конфигурации, чем ОС, но я думаю, это зависит от того, что вы подразумеваете под OS-зависимым. – rici

ответ

2

Я попробовал это на своей машине Linux, и получаю 1 как вывод, положительный, как ваш.

Затем я редактировал поддерживаемые локали в /etc/locale.gen, раскомментирована pl_PL.UTF-8 (не включена по умолчанию), запустите sudo locale-gen и теперь она дает -4, что является отрицательным, как и ожидалось.

Вывод состоит в том, что ваша системная конфигурация, как есть, не поддерживает выбранную локаль.

1

Проверьте обратное значение setlocale; это, вероятно, не распознает строку вашей страны/кодировки.

MS locale names use dashes, not underscores. Если вы находитесь в Windows, попробуйте пройти pl-PL вместо pl_PL.UTF-8.

Смежные вопросы