2016-02-07 5 views
0

ВСЕ,MSVC 2010 и UTF8

Я использую MSVC 2010 для моего проекта и последнего кода для SQLite.

Согласно документации SQLite строки запроса должны быть закодированы как UTF-8.

Как было предложено из некоторых других тем здесь, я попытался использовать u8 "" префикс.

Однако, я получил сообщение об ошибке "u8" не признается: 'U8': необъявленный идентификатор

Итак, теперь 2 вопроса:

  1. Является u8 C++ 11 только?

  2. Как сделать мой проект распознанным префикс u8?

спасибо.

+0

Не знаете, откуда у вас возникла идея, что SQLite требует UTF-8. Все функции, которые я когда-либо видел в API SQLite C, которые принимают строковые параметры, также имеют версию UTF-16. – MrEricSir

+0

@MrEricSir, если у меня есть символ Unicode внутри имени таблицы, моя строка запроса будет лучше кодироваться как UTF-8. – Igor

+0

Что вы подразумеваете под "лучше кодироваться как UTF-8"? Нет никакой разницы в том, какие символы могут быть закодированы в UTF-16 и UTF-8. – MrEricSir

ответ

0

Префикс строки u8, действительно, C++ 11 или выше.

Однако, если ваши строковые литералы не содержат нелатинских символов, U+0x0080 и выше, это не имеет никакого значения.

+0

буквальной строки не будет. Однако, если я получаю имя таблицы из SQLite, чтобы быть UTF-8, и будет толкать его в строке, отличной от UTF-8, каков будет результат? – Igor

+0

@Igor Ничего. Не секрет, что нет такой вещи, как строка «UTF-8» или строка «non UTF-8». Строка - это строка. Строка содержит байты, представляющие символы. UTF-8 является механизмом кодирования символов юникода в виде последовательности байтов. u8 "À" и "\ xc3 \ x80" приводит к тому же строковому объекту, который неотличим от другого. –

+0

Я понимаю. Проблема в том, что если у меня есть стандартная строка std ::, которая будет скомпилирована MSVC, а затем мое имя таблицы или таблицы будет закодировано как UTF-8. Я присоединяю это имя таблицы в UTF-8 к запросу std :: string и передаю его обратно в SQLite, который ожидает кодированную строку запроса UTF-8. Что происходит? К сожалению, я не могу проверить это ... – Igor

0

Visual C 2010, похоже, не поддерживает эти префиксы. Однако вы должны просто включать строки UTF-8 в литералы, поскольку они не нарушают правила для строк с нулевым завершением. Может быть какая-то странность со строковыми функциями, они будут обрабатывать строки UTF-8 в порядке, но они будут интерпретировать их как последовательности одиночных байтов, а не символы UTF-8, поэтому сравнения, преобразование случаев и т. Д. Будут работать не так, как ожидалось , Вам понадобится более новая версия Visual Studio, чтобы полностью устранить проблемы.

Также проверьте влияние #pragma execution_character_set("utf-8"). Он доступен только на C++ в Visual Studio, поэтому вам, возможно, придется скомпилировать исходные файлы C как C++, чтобы получить к нему доступ.

+0

мой проект - C++, и вопрос помечен как C++. – Igor

+0

Тогда вы должны быть в порядке с прагмой. Что касается SQLite, то до тех пор, пока содержимое строки UTF-8 будет неважно, компилятор не понимает UTF-8. Пока в строке нет встроенных нулевых символов (UTF-8 - нет), ваш код на C/C++ будет не обратим внимания, для него все это просто байты. –

+0

строки: "std :: string query1 =" SELECT ... FROM .... ";"; который, я считаю, не несет символ \ 0 'в конце. Кроме того, я считаю, что #pragma - это только MSVC, правильно? – Igor

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