4

UTF-16 には、ビッグ エンディアンとリトル エンディアンの 2 種類のエンディアンがあることを知っています。

C++ 標準は std::wstring のエンディアンを定義していますか? それとも実装定義ですか?

標準定義の場合、C++ 標準のどのページでこの問題に関する規則が規定されていますか?

実装定義の場合、それを決定する方法は? たとえば、VC++ の下。コンパイラは、std::wstring のエンディアンが厳密にプロセッサに依存することを保証しますか?

私はこれを知らなければなりません。UTF-16文字列を他の人に送りたいからです。エンディアンを示すために、UTF-16 文字列の先頭に正しい BOM を追加する必要があります。

要するに: std::wstring が与えられた場合、そのエンディアンを確実に判断するにはどうすればよいですか?

4

4 に答える 4

5

エンディアンは、言語に依存するのではなく、MACHINE に依存します。エンディアンは、プロセッサと、プロセッサがメモリ内外でデータを配置する方法によって定義されます。wchar_t (1 バイトよりも幅が広い) を処理する場合、プロセッサ自体は、読み取りまたは書き込みの際に、必要に応じて複数のバイトを整列させて、再度 RAM に読み書きします。コードは、プロセッサの内部レジスタで表される 16 ビット (またはそれ以上) のワードと見なすだけです。

(それが本当にやりたいことであれば)エンディアンを(自分で)決定するには、既知の32ビット(符号なしint)値をRAMに書き込んでから、charポインターを使用して読み戻すことができます。返された順序を探します。

次のようになります。

unsigned int aVal = 0x11223344;
char * myValReadBack = (char *)(&aVal);

if(*myValReadBack == 0x11) printf("Big endian\r\n");
else                       printf("Little endian\r\n");

他の方法があると確信していますが、上記のようなものが機能するはずです。ただし、私の小さなものと大きなものを確認してください:-)

さらに、Windows RT までは、VC++ は実際には intel タイプのプロセッサにのみコンパイルされていました。実際には、エンディアン タイプは 1 つしかありません。

于 2013-02-04T18:32:10.387 に答える
2

これは実装定義です。wstring は単なる wchar_t の文字列であり、任意のバイト順、または任意の古いサイズにすることができます。

于 2013-02-04T18:27:27.740 に答える
1

wchar_t内部的に UTF-16 である必要はなく、UTF-16 エンディアンは wchar の保存方法に影響しません。保存して読み取るだけです。

どこかに送信する前に、wstring を UTF-16 バイトストリームに変換する明示的な手順を使用する必要があります。wchar の内部エンディアンはアーキテクチャに依存するため、手動で変換するよりも、変換にいくつかの不透明なインターフェイスを使用することをお勧めします。

于 2013-02-04T18:41:45.663 に答える
0

正しい BOM を送信するために、エンディアンを知る必要はありません。コード \uFEFF を使用するだけです。これは、実装のエンディアンに応じて、ビッグエンディアンまたはリトルエンディアンになります。実装が UTF-16 か UTF-32 かを知る必要さえありません。Unicode エンコーディングである限り、適切な BOM になります。

残念ながら、wchars もワイド ストリームも Unicode であることが保証されていません。

于 2013-02-04T20:44:49.887 に答える