NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Radek Chalupa:25.2.2018 15:25

Zdravím, mám problém s tříděním podle češtiny v C++ aplikaci nad SQLite.

Vytvořím tabulku příkazem: "create table polozky (id integer primary key, obsah text)"

otevřu naplněnou tabulku a nastavím sqlite3_create_co­llation16, kde mám SQLITE_UTF16 a porovnávací funkce vypadá takhle:
inline int porovnat_texty(vo­id* /arg1/, int /delka1/, const void* str1, int /delka2/, const void* str2)
{
return wcscoll((const wchar_t*)str1, (const wchar_t*)str2);
}

výběr provedu příkazem:L"select obsah from polozky order by obsah collate current_langu­age_sorting"

testuji v konzolové aplikaci, kde na začátku nastavím
_wsetlocale(LC_ALL, L"Czech");

ve výsledku jsou české znaky setříděny, ale malá/velká jsou tam v pořadí jak je plním, tj. např.
a-A-Z-z místo požadovaného a-A-z-Z;

Funkce wcscoll by měla fungovat podle očekávání, testoval jsem to na setřídění vektoru a výsledek je podle očekávání, viz. kod:

bool porovnat(wstring s1, wstring s2)
{
return wcscoll > 0;
}

void test_trideni()
{
vector<wstring> v;
v.push_back(L"ŽŽŽ");
v.push_back(L"žžž");
v.push_back(L"čá");
v.push_back(L"ca");
v.push_back(L"a­ak");
v.push_back(L"A­AK");
v.push_back(L"ZZ");
v.push_back(L"zz");
sort(v.begin(), v.end(), porovnat);
for (size_t i = 0; i < v.size(); i++)
{
wprintf(v.at(i)­.c_str());
wprintf(L"\n");
}
}

Neví někdo jak to rozchodit?

 
Odpovědět
25.2.2018 15:25
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.