$ cat test_encoding_conv.cpp
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
int main() {
std::string str = "z";
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring wstr = converter.from_bytes(str);
std::string utf8 = converter.to_bytes(wstr);
std::cout << utf8 << std::endl;
return 0;
}
$ g++ -std=c++14 -o test_encoding_conv test_encoding_conv.cpp
$ ./test_encoding_conv
稀
Делал по примеру отсюда: http://stackoverflow.com/questions/7153935/how-to-convert-utf-8-stdstring-to-...
Почему не работает и печатает какой-то иероглиф вместо «z»?
РЕШЕНИЕ: Заменить std::codecvt_utf8_utf16 на std::codecvt_utf8. В результате всё отлично работает.
Как известно, на Linux wchar_t 32-битный, а под офтопиком - 16-битный. И судя по всему std::codecvt_utf8_utf16 неадекватно себя ведёт в этом случае. Соответственно, нужно либо гарантированно 16-битный тип, либо использовать другой преобразователь кодировку. Ответ на SO скорее всего тестировался под виндой, либо на другой версии libstdc++ (у кого-то всё работает, вероятно, баг имеет место быть не во всех версиях).