Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.14.224.197] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток! Господа. Наведите на путь истинный. Работаю с базой SQLite в связке с MSVC 2010. Надо в базу запихать слова с Русскими буквами (да и вообще любой юникод). Суть проста. Читаем CSV файл, разбираем его и пишем в базу. Понятное дело что SQLite работает с UTF-8. Собственно все англ буквы пишутся нормально а вот другие ... уже ромбиками.
Задача проста. char -> wchar -> utf-8. Либо char -> utf-8. Без разницы. Для конвертации wchar -> utf-8 использую следующий код: const char * ConvertToUTF8(const wchar_t * pStr) { static char szBuf[1024]; WideCharToMultiByte(CP_UTF8, 0, pStr, -1, szBuf, sizeof(szBuf), NULL, NULL); return szBuf; } Если я вызову этот код напрямую то получу рабочий результат. ConvertToUTF8(L"Привет мир Hello World"); Но входящие данные у меня в виде ASCII\char. Собственно мне надо сделать конвертацию в wchar_t а тогда уже отправить в utf-8. Как бы я не старался перекодировать в wchar_t - не выходит, конечный результат в utf-8 не вменяемый. Примеры как я конвертировал char в wchar_t 1) const char* ASCII_to_UTF8(const std::string s) { wchar_t *buf = new wchar_t[ s.size() ]; size_t num_chars = mbstowcs( buf, s.c_str(), s.size() ); wstring ws( buf, num_chars ); delete[] buf; return ConvertToUTF8(ws.c_str()); } 2) int StringToWString(std::wstring &ws, const std::string &s) { std::wstring wsTmp(s.begin(), s.end()); ws = wsTmp; return 0; } 3) template<class T,class A> std::wstring to_unicode( std::basic_string<char,T,A> const& in, std::locale const& loc = std::locale()) { typedef std::codecvt<wchar_t,char,std::mbstate_t> facet; const facet& cvt = std::use_facet<facet>(loc); std::wstring out; out.reserve(in.length()); facet::state_type state = facet::state_type(); const char *ibuf = in.data(), *iend = in.data() + in.size(); while(ibuf != iend) { wchar_t obuf[256], *oend; facet::result res = cvt.in(state, ibuf, iend, ibuf, obuf, obuf+256, oend=obuf); if( res == facet::error ) { state = facet::state_type(); ibuf += 1; } out.append(obuf, oend - obuf); if( res == facet::error ) out += L'?'; } return out; } 4) const char* ASCII_to_UTF8(const std::string s) { std::wstringstream cls; cls << s.c_str(); return ConvertToUTF8(cls.str().c_str()); } Вроде любой из этих методов конвертирует в wchar_t но в тот же момент после конвертации в utf-8 получается ерунда. Пожалуйста помогите, поставьте на путь истинный |
Сообщ.
#2
,
|
|
|
Цитата Killbrum @ Но входящие данные у меня в виде ASCII\char. Собственно мне надо сделать конвертацию в wchar_t а тогда уже отправить в utf-8. Попробуй MultiByteToWideChar. Или самому врукопашную - UTF-8 |
Сообщ.
#3
,
|
|
|
// Convert a wide Unicode string to an UTF8 string std::string utf8_encode(const std::wstring &wstr) { int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL); std::string strTo( size_needed, 0 ); WideCharToMultiByte (CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL); return strTo; } // Convert an UTF8 string to a wide Unicode String std::wstring utf8_decode(const std::string &str) { int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0); std::wstring wstrTo( size_needed, 0 ); MultiByteToWideChar (CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed); return wstrTo; } std::string ASCII_to_UTF8(const std::string s) { std::wstring s1 = utf8_decode(s); return utf8_encode(s1); } Все правильно? |