На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Преобразование std::string в std::wstring туда и обратно, как делается?
    Ataru, вот еще вариант на винапи
    ExpandedWrap disabled
      void utf16to8( const std::wstring& utf16, std::string& utf8 )
      {
          char    mUtf8[ MAX_PATH ] = { 0 };
       
          int len = WideCharToMultiByte(CP_UTF8, 0, utf16.c_str(), -1, NULL, 0, 0, 0);
          if (len >= 1 && len < MAX_PATH )
          {
              WideCharToMultiByte(CP_UTF8, 0, utf16.c_str(), -1, mUtf8, len, 0, 0);
          }
       
          utf8 = mUtf8;
      }
       
      void utf8to16(const std::string& utf8, std::wstring& utf16)
      {
       
          wchar_t mUtf16[ MAX_PATH ] = { 0 };
       
          int len = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0);
          if ( len >= 1 && len < MAX_PATH )
          {
              MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, mUtf16, len );
          }
       
          utf16 = mUtf16;
      }
    Сообщение отредактировано: progman -
      Этот способ тоже добавляет в начало символы и тоже только при первом преобразовании. Из "text" делает "text"

      И почему названия функций и переменных такие странные? utf8 это и есть юникод. Корректнее было бы назвать Utf8ToASCII(), мне во всяком случае нужно именно такое преобразование

      Добавлено
      Все, сорри, вопрос снимается. Этот первый символ оказывается раньше появляется, т.е. проблема в другом месте. Просто в отладчике его не видно, если смотреть значение wstring, но он есть в буфере, из которого эта wstring создается.
        Добавляемые символы - это BOM (Byte Order Mark). Показывают порядок байт в широких символах. Добавляются скорее всего текстовым редактором (виндовый Notepad так делает), хотя в файле с кодировкой UTF-8 их ставить не обязательно. По стандарту их наоборот не должно быть.
        WideChar и MultyByte это исторические названия, пришли из времён, когда названий UNICODE и UTF-8 ещё не придумали.
          Цитата Ataru @
          И почему названия функций и переменных такие странные? utf8 это и есть юникод. Корректнее было бы назвать Utf8ToASCII(), мне во всяком случае нужно именно такое преобразование

          конвертация зависит от флагов у APIшной функции MultiByteToWideChar, в моем случае это CP_UTF8 а вам надо CP_ACP

          Цитата Ataru @
          Корректнее было бы назвать Utf8ToASCII()

          С флагом CP_ACP, соглашусь, было бы корректнее. но у меня именно UTf8 <-> UTF16
          Сообщение отредактировано: progman -
          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0228 ]   [ 15 queries used ]   [ Generated: 15.09.25, 08:45 GMT ]