Please specify if there is a difference in representation between Windows and Linux machines (like std::wstring consuming 4 bytes in Linux and 2 bytes in Windows).
And please also specify endianness if necessary.
3 に答える
製品の MS Office ファミリ内で使用されるコード ページである utf-16BE は、すべての文字を 2 バイトとして格納し、Unicode 文字セットの「標準」部分とほとんど同じです。
Linux はおそらく utf-8 を使用しており、これは標準の ASCII 文字を 1 バイトで格納しますが、Unicode コード ポイントに応じて、他の Unicode 文字を 2 バイト、3 バイト、または 4 バイトで格納する場合があります。左端のビットは、ASCII ではないこと、およびマルチバイト文字にどの程度入っているかを示すフラグで使用されます。(ランダムなバイトでutf-8文字列にジャンプして、現在の文字の開始を見つけることができるという考えです。)
Unicode 固有のコード ポイントが高い (Java で使用されている) 極東文字セットのほとんどは、通常、UTF-8 よりもスペースと処理時間が効率的です。
いいえ、できません。しかし、このサイトはできます。
これは、あなたの望むことですか:
int main()
{
std::wstring data1 = L"U+9FA5 (\0x9FA5)";
std::wstring data2 = L“U+0041 (A)";
}
wstringは、wchar_tオブジェクトの単なるコンテナです。
文字の暗黙のエンコーディングはありません(それはあなたがそれを置いたものを保存するだけです)。
Windows wchar_tは現在2バイトであるため、おそらくUTF-16文字しか格納できません。Linuswchar_tは通常4バイトです。したがって、UTF-16またはUTF-32のエンコーディングを使用できます。ほとんどの通常の状況ではありますが、これらのオーバーラップと上半分はすべてゼロです(もちろん、例外はBMPまたはサロゲートペアにないコードポイントです)。
注:UTF-8文字は、固定幅ではないため、通常、アプリケーションの内部で使用されません(使用できますが)。ただし、圧縮性があるため(ASCIIとの下位互換性は損なわれません)、トランスポートとストレージに非常に役立ちます。
注:C / C ++は、文字列に他のエンコード形式を使用することを排除するものではありません。