2016-03-18 4 views
1

Моя цель состоит в том, чтобы преобразовать wchar_t в char, мой подход состоял в использовании boost::locale (с использованием boost 1.60). Например,Преобразование wchar_t в char с повышением locale

wchar_t * myWcharString = "0000000002" (Memory 0x 30 00 30 00 ... 32 00)

в

char * myCharString = "0000000002" (Memory 0x 30 30 ... 32)

Я написал функцию:

inline char* newCharFromWchar(wchar_t * utf16String) { 
    char * cResult = NULL; 
    try { 
     std::string szResult = boost::locale::conv::from_utf(utf16String, "UTF-8"); 
     cResult = new char[szResult.size() + 1]; 
     memset(reinterpret_cast<void*>(cResult), 0, szResult.size() + 1); 
     memcpy(reinterpret_cast<void*>(cResult), 
      reinterpret_cast<const void*>(szResult.c_str()), 
      szResult.size()); 
    } 
    catch (...) { 
     // boost::locale::conv might throw 
    } 
    return cResult; 
} 

Теперь проблема заключается в том, что с VS2013 он ведет себя по-разному в gcc и clang, т.е.

// VS 2013 behaves as expected 
wchar_t * utf16String = "0000000002" (Memory 0x 30 00 30 00 ... 32 00) 
char * cResult = "0000000002" (Memory 0x 30 30 ... 32) 

// both gcc and clang NOT as expected: 
wchar_t * utf16String = "0000000002" (Memory 0x 30 00 30 00 ... 32 00) 
char * cResult = "2" (Memory 0x 32) 

И реализация подталкивание gcc и clang, кажется, используют только последние 2 байта моего входа wchar_t, хотя он обрабатывается правильно относительно начального и конечного адреса ввода.

Что мне не хватает?

+0

'from_utf (utf16String," UTF-16 ")'? – YSC

+2

@YSC Nope. Цель должна быть «UTF-8» – fiscblog

+0

'new' ...' memset' ... 'memcpy' ...' reinterpret_cast 'raise * so * many red flags. Пересмотрите этот код. –

ответ

0

VS2013 принимает wchar_t как 16-разрядный символ, в то время как gcc и clang принимают 32-разрядный символ (на моей машине).

Так что если я храню 0x 30 00 30 00 ... 32 00 как wchar_t, он работает только с VS2013, как и ожидалось. boost::locale будет считать, что 0x 30 00 30 00 - это один символ вместо двух, как я и ожидал. Таким образом, получаемый результат полностью отличается от этих платформ.

Смежные вопросы