Краткий ответ:
Преобразование не требуется, если вы используете строки Unicode, такие как CString или wstring. Используйте sqlite3_open16 ().
Вам нужно будет убедиться, что вы передали указатель WCHAR (приведенный к void *
. Кажется, хромает! Даже если эта библиотека кроссплатформенная, я думаю, они могли бы определить широкий тип символа, который зависит от платформы и менее недружелюбен void *
) к API. Например, для CString: (void*)(LPCWSTR)strFilename
Более длинный ответ:
У вас нет строки Unicode, которую вы хотите преобразовать в UTF8 или UTF16. У вас есть строка Unicode, представленная в вашей программе с использованием заданной кодировки: Unicode не является двоичным представлением как таковым. Кодировки говорят о том, как кодовые точки Unicode (числовые значения) представлены в памяти (двоичное расположение числа). UTF8 и UTF16 являются наиболее широко используемыми кодировками. Хотя они очень разные.
Когда в проекте VS говорится «кодировка Unicode», это фактически означает «символы, закодированные как UTF16». Следовательно, вы можете использовать sqlite3_open16 () напрямую. Преобразование не требуется. Символы хранятся в типе WCHAR (в отличие от char
), который занимает 16 бит (отступление на стандартном типе C wchar_t
, что на Win32 занимает 16 бит. На других платформах может отличаться.
Есть еще одна деталь, на которую вы могли бы обратить внимание: UTF16 существует в двух вариантах: Big Endian и Little Endian. Это порядок байтов этих 16 битов. Прототип функции, который вы даете для UTF16, не говорит, какой порядок используется. Но вы вполне уверены, если предположите, что sqlite использует тот же порядок байтов, что и Windows (Little Endian IIRC. Я знаю порядок, но у меня всегда были проблемы с именами :-)).
РЕДАКТИРОВАТЬ: Ответ на комментарий шашки:
UTF16 использует 16 бит кодовых единиц . Под Win32 (и только на Win32), wchar_t
используется для такого хранилища. Хитрость заключается в том, что некоторым символам Юникода требуется последовательность из 2 таких 16-битных единиц кода. Их называют суррогатными парами.
Точно так же, как UTF8 представляет 1 символ, используя последовательность от 1 до 4 байтов. Тем не менее, UTF8 используются с типом char
.