Использование китайских символов в sqlite3 - PullRequest
1 голос
/ 20 декабря 2011

Я из Китая, у меня вопрос по sqlite, но мой английский немного плохой. Я постараюсь четко выразить себя.

Недавно я сделал что-то в sqlite, используя Visual Studio 2005 (VC ++) для разработки WinCE, используя базу данных sqlite. В моей таблице поле содержит несколько китайских символов. Когда я показываю их, я не получаю то, что хочу, потому что все они странные персонажи.

Я использую желаемое значение возвращаемого столбца функций, но не могу.

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
// or
const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);

Они сказали, что кодировка в sqlite3 - это utf8, поэтому вам нужно конвертировать ее в юникод. Я попытался выполнить эту работу с помощью функции, найденной в Интернете, которая выглядит следующим образом:

wstring UTF8ToUnicode(const string& strin)
{
    wstring strOut;
    int dwNum = MultiByteToWideChar(CP_UTF8,0,strin.c_str(),-1,0,0)
    wchar_t* pBuffer = new wchar_t[dwNum];
    if (!pBuffer){return strOut;}
    memset(pBuffer,0,dwNum*sizeof(wchar_t));
    if (MultiByteToWideChar(CP_UTF8,0,strin.c_str(),-1,pBuffer,dwNum)>=0)
    {
        strOut= pBuffer;
    }
    delete[] pBuffer;
    return strOut;
}

Ответы [ 2 ]

4 голосов
/ 20 декабря 2011

"Они сказали, что кодировки в sqlite3 - это utf8"

Кто бы ни сказал, что это неправильно. Используемая кодировка зависит от того, как база данных открыта.

"Кодировка по умолчанию для базы данных будет UTF-8, если вызывается sqlite3_open () или sqlite3_open_v2 (), и UTF-16 в собственном порядке байтов, если sqlite3_open16 () используется."

http://sqlite.org/c3ref/open.html

Однако это вряд ли имеет значение. Однако данные хранятся sqlite3_column_text () всегда будет возвращать UTF8, а sqlite3_column_text16 () всегда будет возвращать UTF16 в собственном порядке байтов. Вам не нужно писать собственный конверсионный код yopur. Единственное отличие заключается в эффективности - это немного быстрее извлечь сохраненные данные без преобразования.

1 голос
/ 29 апреля 2012

После того, как вы позвонили const sqlite3_column_text16, вы позвонили sqlite3_column_bytes?потому что если бы вы сделали, это изменило бы символы на байты.Вот мой код для получения китайского, он хорошо работает.

void sqlite3_column_string16(sqlite3_stmt* stmt, int col, std::wstring* str) {
    int len = sqlite3_column_bytes(stmt, col);
    const wchar_t* c_str = static_cast<const wchar_t*>(sqlite3_column_text16(stmt, col));
    if (c_str && len > 0)
        str->assign(c_str, len);
    else
        *str = _T("");
}
...