1

この Java コードを (管理されていない) C++ で実装する必要があります。

byte[] b = string.getBytes("UTF8");

私はC ++が初めてで、これを行う方法が見つかりません。可能であれば、プラットフォームに依存しない必要があります。C++11 コンパイラを使用しています。

4

4 に答える 4

3

Javaは、 の特殊化であるStringとほぼ同等です。次のようなものを試してみることをお勧めします...std::u16stringstd::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 で追加された新しい文字リテラル プレフィックスを使用します。特に、uUTF char16_t-16 文字列用の :-) UTF-8 と UTF-32 用のと もu8あります。U


PSdataは (C++11 以降) と等しいことが保証されているc_strため、NUL で終了することに依存できます。

于 2012-09-01T19:53:47.133 に答える
1

ソリューション番号 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;
于 2012-09-01T20:12:11.400 に答える
0

文字列が既に UTF-8 であると仮定すると、次を使用できます。

char const *c = myString.c_str();

読み取り/書き込みアクセスの場合、次を使用できます。

std::vector<char> bytes(myString.begin(), myString.end());
bytes.push_back('\0');
char *c = &bytes[0];
于 2012-09-01T18:55:35.867 に答える
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;
于 2012-09-01T19:13:35.283 に答える