BadJerry Ответов: 1

Сравнение строк fussballmanager и fußballmanager в C++


В SQL вы можете успешно сравнить две строки в зависимости от параметров сортировки
С Latin1_General_CI_AS fussballmanager и fußballmanager считаются равными.

Они отличаются от SQL_Latin1_General_CP1_CI_AS.

Я пытаюсь воспроизвести то же самое поведение в C++. Я понимаю, что это зависит от локали, и я хотел бы иметь какой-то код, где пользователь может решить, какой язык использовать.

Что я уже пробовал:

STL


std::locale loc1("german");

wstring a("fussballmanager");
wstring b("fußballmanager");

const std::collate<wchar_t>& coll = use_facet<std::collate<wchar_t> >(loc1);
int nRes = coll.compare(a.data(), a.data() + a.size(),
                        b.data(), b.data()  + b.size());
// => nRes is 1 not 0


ПОВЫШАТЬ


boost::locale::generator gen;
std::locale loc = gen("en-GB");
std::locale::global(loc);


wstring a("fussballmanager");
wstring b("fußballmanager");
int nRes = use_facet<boost::locale::collator<wchar_t> >(loc).compare(boost::locale::collator_base::primary, a, b);
// Crash here (it works if I leave the locale string empty: replace en-GB by ""

BadJerry

Хорошо, если вы напишете следующее (добавьте ut8) - никакого сбоя в Boost!

std::locale loc = gen("en-GB.UTF-8");

Решения Йохена, вероятно, означают отсутствие необходимости в усилении для других ( у меня он уже был)

1 Ответов

Рейтинг:
12

Jochen Arndt

Есть очень хороший ответ про сравнение строк в такой теме:
c++ - как сравнить "basic_string" с помощью arbitary locale - переполнение стека[^].

Что касается ваших примеров SQL, то оба они должны возвращать false для строк примера при использовании AS (Диакритические Знаки). Но я не совсем уверен в особом случае Эсцет Единственная разница заключается в том, что CP1 который выбирает кодовую страницу 1252, в то время как другой использует кодовую страницу по умолчанию (которая тоже может быть 1252).

Я до сих пор не использовал функции сортировки и сравнения boost и поэтому не могу дать решение с их помощью.

Если вы находитесь в Windows, вы можете использовать Функция CompareStringEx (Windows)[^].

Существует также ICU-международные компоненты для Unicode[^] проект, предоставляющий библиотеку, поддерживающую сопоставленное сравнение (см. Сортировка-руководство пользователя ICU[^]).


BadJerry

Очень полезно - не знал о CompareStringEx, который я сейчас попробую! Я также знал о ICU, но не хотел добавлять больше зависимости в свой проект.
Тхак тебе очень нравится!