在Linux上将wstring转换为jstring

我在unix中将wstring转换为jstring时遇到问题,因为linux上的wchar_t的大小为4个字节(不像2个字节那样,因为我不能使用wchar_t转换为jchar)。

谁能帮助我呢?

谢谢,Reza

你必须使用像iconv()这样的东西,因为C ++宽字符串有一个不透明(读取:未知)编码,而Java需要UTF16。 尝试这个:

 #include  #include  #include  #include  std::u16string convert(std::wstring s) { iconv_t cd = iconv_open("UTF-16BE", "WCHAR_T"); if (cd == iconv_t(-1)) { std::cout << "Error while initializing iconv: " << errno << std::endl; iconv_close(cd); return std::u16string(); } std::size_t n = s.length() * 2 + 1; // Each character might use up to two CUs. const std::size_t norig = n; std::size_t m = s.length() * sizeof(std::wstring::value_type); std::vector obuf(n); char * outbuf = reinterpret_cast(obuf.data()); const char * inbuf = reinterpret_cast(&s[0]); const std::size_t ir = iconv(cd, const_cast(&inbuf), &m, &outbuf, &n); if (ir == std::size_t(-1)) { std::cout << "Error while converting with iconv(): " << errno << ":" << EINVAL << ", left " << m << ", written " << std::dec << norig - n << " bytes." << std::endl; iconv_close(cd); return std::u16string(); } iconv_close(cd); return std::u16string(obuf.data(), (norig - n)/sizeof(std::u16string::value_type)); } 

如果没有char16_tstd::u16string ,则可以使用uint16_t作为基本字符类型,使用std::basic_stringstd::vector作为结果容器。