Нечувствительные к регистру UTF-8 представляют сопоставление в виде строки для SQLite (C/C++)

Перебирайте свойства класса, как:

pubic string ConstructDays(DaysDetails d)
{
 int Idx = 0;
    string days = "";
    var obj = new DaysDetails ();
    foreach (var p in obj .GetType().GetProperties())
    {   days += (bool)p.GetValue(obj ) ? (days=="" ? Idx.ToString() : ","+Idx.ToString()) : "";
        Idx++;
    }
return days
}
7
задан chills42 5 November 2008 в 13:56
поделиться

6 ответов

То, что Вы действительно хотите, логически невозможно. Нет никакого независимого от локали, нечувствительного к регистру способа отсортировать строки. Простой контрпример является "i" <> "I"? Наивный ответ не, но на турецком языке эти строки неравны. "i" является uppercased к "İ" (U+130 Latin Capital I с точкой выше)

Строки UTF-8 добавляют дополнительную сложность к вопросу. Они - совершенно допустимый многобайтовый символ* строки, если у Вас есть соответствующая локаль. Но ни C, ни стандарт C++ не определяют такую локаль; согласуйте со своим поставщиком (слишком много встроенных поставщиков, извините, никакой общий ответ здесь). Таким образом, необходимо выбрать локаль, многобайтовое кодирование которой является UTF-8, чтобы функция mbscmp работала. Это, конечно, влияет на порядок сортировки, который является зависимым локали. И если у Вас нет локали, в которой символ константы* является UTF-8, Вы не можете использовать этот прием вообще. (Насколько я понимаю CRT Microsoft страдает от этого. Их многобайтовый код только обрабатывает символы до 2 байтов; UTF-8 нужно 3)

wchar_t не является стандартным решением также. Это, предположительно, столь широко, что Вы не должны иметь дело с многобайтовой кодировкой, но Ваше сопоставление будет все еще зависеть от локали (LC_COLLATE). Однако использование wchar_t означает, что Вы теперь выбираете локали, которые не используют UTF-8 для константы char*.

Со сделанным, можно в основном записать собственное упорядочивание путем преобразования строк в нижний регистр и сравнения их. Это не прекрасно. Вы ожидаете L "ß" == L "ss"? Они даже не та же длина. Все же для немца необходимо считать их равными. Можно ли жить с этим?

7
ответ дан 7 December 2019 в 07:52
поделиться

Я не думаю, что существует стандартная библиотечная функция C/C++, которую можно использовать. Вы будете иметь к самокрутке или пользоваться сторонней библиотекой. Полная спецификация Unicode для определенного для локали сопоставления может быть найдена здесь: http://www.unicode.org/reports/tr10/ (предупреждение: это - длинный документ).

0
ответ дан 7 December 2019 в 07:52
поделиться

В Windows можно звонить, возвращаются к функции ОС CompareStringW и используют флаг NORM_IGNORECASE. Необходимо будет преобразовать строки UTF-8 в UTF-16 сначала. Иначе смотрите на Международные Компоненты IBM для Unicode.

0
ответ дан 7 December 2019 в 07:52
поделиться

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

0
ответ дан 7 December 2019 в 07:52
поделиться

У меня нет категорического ответа в форме примера кода, но я должен указать, что поток байтов UTF-8 содержит, на самом деле, символы Unicode, и необходимо использовать wchar_t версии библиотеки времени выполнения C/C++.

Необходимо преобразовать те байты UTF-8 в строки wchar_t сначала, все же. Это не очень твердо, поскольку стандарт кодировки UTF-8 очень хорошо документируется. Я знаю это, потому что я сделал это, но я не могу совместно использовать тот код с Вами.

0
ответ дан 7 December 2019 в 07:52
поделиться

Если Вы используете его, чтобы сделать поиск и сортировку для Вашей локали только, я предлагаю, чтобы Ваша функция вызвала простую функцию замены, которые преобразовывают обе байтовых строки в одного байта за символ с помощью таблицы как:

A-> a
Ã-> a
á-> a
ß-> ss
Ç-> c
и так далее

Затем просто назовите strcmp и возвратите результаты.

0
ответ дан 7 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: