にUTF-16BE文字列の定義:私はそうのようになります。Unicode文字列を定義する必要がC++
const char SOME_STRING[] = { 0, 5, 0, 'M', 0, 'y', 0, 'S', 0, 't', 0, 'r' };
これは、短い長さを含むビッグエンディアンで先頭に付加UTF-16BE文字列である、それはJavaで使用され、それが何です私はそれが必要です。別々にすべての文字を入力するよりも宣言するほうが良い/きれいな方法がありますか?
にUTF-16BE文字列の定義:私はそうのようになります。Unicode文字列を定義する必要がC++
const char SOME_STRING[] = { 0, 5, 0, 'M', 0, 'y', 0, 'S', 0, 't', 0, 'r' };
これは、短い長さを含むビッグエンディアンで先頭に付加UTF-16BE文字列である、それはJavaで使用され、それが何です私はそれが必要です。別々にすべての文字を入力するよりも宣言するほうが良い/きれいな方法がありますか?
次の例のように、必要に応じてバイトに変換し、代わりにwchar_t
を使用することもできます。
const wchar_t some_string[] = L"\x05MyStr";
int _tmain(int argc, _TCHAR* argv[])
{
for (int i = 0; i <= some_string[0]; i++)
printf("%d %d ", some_string[i] >> 8, some_string[i] & 0xFF);
return 0;
}
CおよびC++は、彼らが作品上で実行されているプラットフォームの方法エンディアン性質を定義していません。したがって、16ビット値のシーケンスをビッグエンディアンと宣言する方法は、言語自体の中にありません。
あなたがしなければならないことは、プラットフォームのネイティブエンディアンで文字列を取得することです。その後、プラットフォームのエンディアンがビッグエンディアンでない場合、バイトスワップを行います。バイトスワップされたバージョンは、std::vector
などで保存できます。
@Nicol Bolas:なぜビッグエンディアンプラットフォームで動作しないのですか? 'wchar_t'を取得し、値をシフトまたはマスクします。それはエンディアンに敏感ではありません。 – MRAB
あなたはそうです。修正されました。 –