Моя цель состоит в том, чтобы преобразовать 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
, хотя он обрабатывается правильно относительно начального и конечного адреса ввода.
Что мне не хватает?
'from_utf (utf16String," UTF-16 ")'? – YSC
@YSC Nope. Цель должна быть «UTF-8» – fiscblog
'new' ...' memset' ... 'memcpy' ...' reinterpret_cast 'raise * so * many red flags. Пересмотрите этот код. –