как сохранить данные кодировки UTF-8 в sqlite3 с помощью Visual C ++ - PullRequest
0 голосов
/ 06 января 2012

Я создал базу данных sqlite с кодировкой UTF-8 (по умолчанию).

Затем я использую следующее выражение для вставки данных:

strcpy(sql,"insert into blog(title) values('呵呵')");
sqlite3_exec(db,sql,0,0,0);

затем я открываю базу данных sqlite с помощью инструмента SQLite Developer. Значение поля title показывает ºǺ� код мусора в разделе Кодировка данных: UNICODE . затем я изменил кодировку данных на ANSI , значение title показывает право.

Как я знаю, прототип sqlite3_exec:

int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

Я все еще пытаюсь передать wchar_t type на sql, но все равно не получится.

Мой проект Visual C ++ уже определен UNOCODE & _UNICODE, поэтому мой вопрос: как сохранить данные кодировки UTF-8 в sqlite3 с помощью Visual C ++?


Обновление (вопрос решен)

Я использую iconv для преобразования GBK кодирования в UTF-8 , вдохновленного msandiford. Большое спасибо msandiford.

char* pOut;
char* pIn;
size_t inLen,outLen=2000;
strcpy(sql,"insert into blog(title) values('呵呵')");
string strSQL = sql;
char* sql2 = (char*)malloc(2000);
memset(sql2,0,2000);
pOut = &sql2[0];
inLen = strlen(strSQL.c_str());
pIn = const_cast<char*>(strSQL.c_str());
iconv_t g2u8 = iconv_open("UTF-8","GBK");
iconv(g2u8,(const char**)&pIn,&inLen,&pOut,&outLen);
sqlite3_exec(db,sql2,0,0,0);

1 Ответ

4 голосов
/ 06 января 2012

Сбор комментариев в форму ответа:

Судя по комментариям к вопросу, очевидно, что исходные файлы не кодируются в UTF-8. Конвертация в UTF-8 или использование кодировки UTF-8 напрямую, похоже, работает.

Использование кодировки UTF-8 напрямую:

    strcpy(sql,"insert into blog (title) values ('\xE5\x91\xB5\xE5\x91\xB5')");

Вы можете избежать преобразования всех ваших исходных файлов в UTF-8, выполнив что-то вроде этого:

    sprintf(sql, "insert into blog (title) values('%s')", AnsiToUtf8("呵呵"));

К сожалению, функция AnsiToUtf8() будет зависеть от платформы.


Если посмотреть дальше, то похоже, что Visual Studio сохраняет исходные файлы в кодировке по умолчанию для ваших настроек языкового стандарта Windows. Исходя из этого, может существовать целый ряд кодировок, если компьютеры вашей группы разработчиков настроены на разные локали.

Я думаю, было бы довольно сложно, если не невозможно, реализовать функцию AnsiToUtf8(), которая бы справлялась во всех возможных случаях, особенно если учесть, что языковые настройки компьютера, на котором разрабатывается код, могут не соответствовать так же, как компьютер, который в конечном итоге выполняет код.

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

Другим способом было бы интернационализировать код, чтобы исходные файлы не содержали расширенных символов, и использовать что-то вроде GNU gettext или подобное для обработки переводов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...