Linuxでのwchar_tのサイズが4バイトであるため、UNIXでwstringをjstringに変換する際に問題があります(Windowsのように2バイトではないため、wchar_tをjcharにキャストすることはできません)。
誰でもそれを手伝ってもらえますか?
ありがとう、レザ
Linuxでのwchar_tのサイズが4バイトであるため、UNIXでwstringをjstringに変換する際に問題があります(Windowsのように2バイトではないため、wchar_tをjcharにキャストすることはできません)。
誰でもそれを手伝ってもらえますか?
ありがとう、レザ
のようなものを使用する必要がiconv()
あります。Java は UTF16 を想定しているのに対し、C++ のワイド文字列には不透明な (読み取り: 不明) エンコーディングがあるためです。これを試して:
#include <iconv.h>
#include <string>
#include <vector>
#include <iostream>
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<char16_t> obuf(n);
char * outbuf = reinterpret_cast<char*>(obuf.data());
const char * inbuf = reinterpret_cast<const char*>(&s[0]);
const std::size_t ir = iconv(cd, const_cast<char**>(&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_t
とがない場合は、基本的な文字タイプとして およびまたは結果のコンテナーとしてstd::u16string
使用できます。uint16_t
std::basic_string<uint16_t>
std::vector<uint16_t>