この Java コードを (管理されていない) C++ で実装する必要があります。
byte[] b = string.getBytes("UTF8");
私はC ++が初めてで、これを行う方法が見つかりません。可能であれば、プラットフォームに依存しない必要があります。C++11 コンパイラを使用しています。
Javaは、 の特殊化であるString
とほぼ同等です。次のようなものを試してみることをお勧めします...std::u16string
std::basic_string
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert;
std::string converted = convert.to_bytes(u"HELLO, WORLD!");
const char *bytes = converted.data();
これは C++11 に依存していることに注意してください。コンパイラ ベンダーがこれらの機能を完全にサポートするまでには、しばらく時間がかかる可能性があります。
ここでは、新しく導入されstd::wstring_convert
た を使用して、ワイド文字の UTF-16 文字列から UTF-8 マルチバイト文字列にto_bytes
変換します (逆方向の変換もサポートしています)。
std::codecvt_utf8_utf16
これは、(同じく新しく導入された)変換ファセットによって可能になります。実際の変換を適切に処理してくれます。
それに加えて、C++11 で追加された新しい文字リテラル プレフィックスを使用します。特に、u
UTF char16_t
-16 文字列用の :-) UTF-8 と UTF-32 用のと もu8
あります。U
PSdata
は (C++11 以降) と等しいことが保証されているc_str
ため、NUL で終了することに依存できます。
ソリューション番号 1:-
char bytecpp[]= u8"You don't need strings.getbytes :P";
ソリューション番号 2:-
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>> myconv;
std::string mbstring = myconv.to_bytes(u"Hello\n");
std::cout << mbstring;
文字列が既に UTF-8 であると仮定すると、次を使用できます。
char const *c = myString.c_str();
読み取り/書き込みアクセスの場合、次を使用できます。
std::vector<char> bytes(myString.begin(), myString.end());
bytes.push_back('\0');
char *c = &bytes[0];
C++ の文字列は通常、1 文字あたり 1 バイトの ASCII です。そのため、典型的な std::string を使用する場合は、C++ にマーシャリングする前にそれを処理する必要があります。ただし、残念ながら、C++ はワイド文字列 std::wstring を定義しています (ワイド文字に関するウィキペディアの記事から)。
wchar_t の幅はコンパイラ固有で、8 ビットまで小さくすることができます。したがって、C または C++ コンパイラ間で移植可能にする必要があるプログラムでは、Unicode テキストの格納に wchar_t を使用しないでください。wchar_t 型は、コンパイラで定義されたワイド文字 (一部のコンパイラでは Unicode 文字である場合がある) を格納することを目的としています。
したがって、質問に完全に答えるには、どの C++ コンパイラを使用するかを知る必要があります。std::wstring クラスの場合、 to bytes タイプの関数はありません。そのため、他の回答で述べたように c_str() を使用し、 &(bit wise and) とバイトマスクを使用してワイド文字を分割しますバイトに。
Visual C++ では、ワイド文字は 16 ビットであるため、次のようにして各文字をバイト単位で処理する必要があります。
high_byte = wcharacter & 0xFF00;
low_byte = wcharacter & 0xFF;