На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела C/C++: Базы данных
Модераторы: B.V.
  
    > Конвертация в UTF-8 , Работа с SqLite
      Доброго времени суток! Господа. Наведите на путь истинный. Работаю с базой SQLite в связке с MSVC 2010. Надо в базу запихать слова с Русскими буквами (да и вообще любой юникод). Суть проста. Читаем CSV файл, разбираем его и пишем в базу. Понятное дело что SQLite работает с UTF-8. Собственно все англ буквы пишутся нормально а вот другие ... уже ромбиками.

      Задача проста. char -> wchar -> utf-8. Либо char -> utf-8. Без разницы.

      Для конвертации wchar -> utf-8 использую следующий код:
      ExpandedWrap disabled
        const char * ConvertToUTF8(const wchar_t * pStr) {
            static char szBuf[1024];
            WideCharToMultiByte(CP_UTF8, 0, pStr, -1, szBuf, sizeof(szBuf), NULL, NULL);
            return szBuf;
        }


      Если я вызову этот код напрямую то получу рабочий результат.

      ExpandedWrap disabled
        ConvertToUTF8(L"Привет мир Hello World");


      Но входящие данные у меня в виде ASCII\char. Собственно мне надо сделать конвертацию в wchar_t а тогда уже отправить в utf-8. Как бы я не старался перекодировать в wchar_t - не выходит, конечный результат в utf-8 не вменяемый.

      Примеры как я конвертировал char в wchar_t

      1)
      ExpandedWrap disabled
        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)
      ExpandedWrap disabled
        int StringToWString(std::wstring &ws, const std::string &s)
        {
            std::wstring wsTmp(s.begin(), s.end());
            ws = wsTmp;
            return 0;
        }


      3)
      ExpandedWrap disabled
        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)
      ExpandedWrap disabled
        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 получается ерунда. Пожалуйста помогите, поставьте на путь истинный :)
        Цитата Killbrum @
        Но входящие данные у меня в виде ASCII\char. Собственно мне надо сделать конвертацию в wchar_t а тогда уже отправить в utf-8.

        Попробуй MultiByteToWideChar.

        Или самому врукопашную - UTF-8
        Сообщение отредактировано: ЫукпШ -
          ExpandedWrap disabled
            // 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);
            }



          Все правильно?
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0238 ]   [ 17 queries used ]   [ Generated: 20.04.24, 05:21 GMT ]