Сравнение строк и буква 'Ё'
От: Andrusha  
Дата: 26.12.11 12:07
Оценка:
Доброго Нового года!

int iRes = wcscmp(L"актёр", L"актуа");

Почему в этом случае iRes == 1?

Эксперименты с setlocale, сравнение как однобайтовых строк и так далее — ничего не дают. В любом случае сортировка идёт неправильно. Спотыкается или на букве Ё или Й.
Re: Сравнение строк и буква 'Ё'
От: k06a http://k06a.blogspot.com/
Дата: 26.12.11 12:14
Оценка:
Здравствуйте, Andrusha, Вы писали:

A>Доброго Нового года!


A>
A>int iRes = wcscmp(L"актёр", L"актуа");
A>

A>Почему в этом случае iRes == 1?

A>Эксперименты с setlocale, сравнение как однобайтовых строк и так далее — ничего не дают. В любом случае сортировка идёт неправильно. Спотыкается или на букве Ё или Й.


Всё верно. Эти буквы идут за кирилличесуим алфавитом. Можно написать свою функцию сравнения. Но наверняка есть что-нить стандартненькое. Тоже жду вариантов ответа.
Re[2]: Сравнение строк и буква 'Ё'
От: Andrusha  
Дата: 26.12.11 13:02
Оценка:
Здравствуйте, k06a, Вы писали:

K>Здравствуйте, Andrusha, Вы писали:


A>>Доброго Нового года!


A>>
A>>int iRes = wcscmp(L"актёр", L"актуа");
A>>

A>>Почему в этом случае iRes == 1?

A>>Эксперименты с setlocale, сравнение как однобайтовых строк и так далее — ничего не дают. В любом случае сортировка идёт неправильно. Спотыкается или на букве Ё или Й.


K>Всё верно. Эти буквы идут за кирилличесуим алфавитом. Можно написать свою функцию сравнения. Но наверняка есть что-нить стандартненькое. Тоже жду вариантов ответа.


Это, конечно, какбы понятно, но есть нюанс. Вот такой код работает верно:
_tsetlocale(LC_ALL, _T("Russian"));

int iRes = wcscoll(L"актёр", L"актуа");


Но проблемы с Й остаются:
int iRes = wcscoll(L"аил", L"айканье");

Почему-то iRes == 1.
Re[3]: Сравнение строк и буква 'Ё'
От: c-smile Канада http://terrainformatica.com
Дата: 26.12.11 18:39
Оценка:
Здравствуйте, Andrusha, Вы писали:

A>Но проблемы с Й остаются:

A>
A>int iRes = wcscoll(L"аил", L"айканье");
A>

A>Почему-то iRes == 1.

Так и надо ибо 'й' расположена после буквы 'и' в русском алфавите.
Re[3]: Сравнение строк и буква 'Ё'
От: uzhas Ниоткуда  
Дата: 26.12.11 20:24
Оценка:
Здравствуйте, Andrusha, Вы писали:

A>Но проблемы с Й остаются:

A>
A>int iRes = wcscoll(L"аил", L"айканье");
A>

A>Почему-то iRes == 1.

вы путаетесь в показаниях: http://ideone.com/kG4aw
четко изложите какой у вас код, какой результат, не путайте 'ё' и 'Ё', 'й' и 'Й'

полезная таблица символов: http://www.utf8-chartable.de/unicode-utf8-table.pl
в режиме телепатии могу предположить, что либо кодировка исходников неочевидная, либо вы неправильно выставляете локаль
рекомендую вам в тесте выводить коды символов и сравнивать с табличкой символов
еще можно проверять, что же возвращает setlocale
Re[4]: Сравнение строк и буква 'Ё'
От: Кодт Россия  
Дата: 27.12.11 02:02
Оценка:
Здравствуйте, uzhas, Вы писали:

U>в режиме телепатии могу предположить, что либо кодировка исходников неочевидная, либо вы неправильно выставляете локаль

U>еще можно проверять, что же возвращает setlocale

А вот это — запросто. В винде локали именуются немного нестандартно. Не ru, а rus, например.
За подробностями — в MSDN.
http://msdn.microsoft.com/en-us/library/39cwe7zf%28v=vs.71%29.aspx
Перекуём баги на фичи!
Re: Сравнение строк и буква 'Ё'
От: megahammer  
Дата: 27.12.11 05:51
Оценка:
Здравствуйте, Andrusha, Вы писали:

A>Доброго Нового года!


A>
A>int iRes = wcscmp(L"актёр", L"актуа");
A>

A>Почему в этом случае iRes == 1?

A>Эксперименты с setlocale, сравнение как однобайтовых строк и так далее — ничего не дают. В любом случае сортировка идёт неправильно. Спотыкается или на букве Ё или Й.


Попробуйте lstrcmp
Re[2]: Сравнение строк и буква 'Ё'
От: potapov.d  
Дата: 27.12.11 05:52
Оценка:
Здравствуйте, megahammer, Вы писали:

M>Попробуйте lstrcmp

$ man lstrcmp
No manual entry for lstrcmp


И даже стандарт C11 ничего про эту функцию не знает.
Re[3]: Сравнение строк и буква 'Ё'
От: megahammer  
Дата: 27.12.11 05:59
Оценка:
Здравствуйте, potapov.d, Вы писали:

PD>Здравствуйте, megahammer, Вы писали:


M>>Попробуйте lstrcmp

PD>
PD>$ man lstrcmp
PD>No manual entry for lstrcmp
PD>


PD>И даже стандарт C11 ничего про эту функцию не знает.


Извиняюсь, не уточнил – это только под Windows.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.