1

私は、シリアル化されたstd :: wstringを送信するソケットを持っています。たとえば、中国語版のWindowsからアラビア語のUIを扱うUnixシステム"中国語Windows"から "arabic Windows"に送信されたstd :: wstring

これらのstd :: wstringが中国語であることを私のUnixシステム(あるいは何か)がどのように知っているのかわかりません。「コードページ」(別名カントリー言語?)がstd :: wstring、潜在的に各std :: wstringのコードページを自分自身に関連付ける必要がありますか?

私はこれが私たちの相互接続された世界での基本的な質問のように見えるよう、確実に何かを欠場...

おかげで、

答えて

3

wstringの目的が含まれて全体のUnicode文字セットを、できるようにすることです中国とアラビア語、および人に知られているすべての文字セット。これは、コードページの概念をほとんど完全に廃止しています。文字は、任意の言語に基づいたコンピュータ上で同じ表現をしています。

詳しくは、The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)を参照してください。

wchar_tは通常Windowsでは16ビット、Linuxでは32ビットとなるため、転送に問題が発生する可能性があります。ビッグエンディアンとリトルエンディアンのどちらの問題も心配するかもしれません。最も安全な方法は、Unicode文字を明白な8ビットのバイト列にエンコードするUTF-8経由で転送することです。

1

一般に、wstringは、言語に中立なユニコードエンコードとしてエンコードされます。自分のコンピュータで使用している言語設定に関係なく、wstringの内容は同じです(これはUnicodeの主な利点の1つです)。

ただし、複数のUnicodeエンコーディングがあり、UnixプラットフォームではWindowsとは異なるものが使用されることがあります(UCS-32とUTF-16)。マシン間での転送のために明示的にUTF-8に変換することをお勧めします。 WindowsではWideCharToMultiByteCP_UTF8)を使用し、unixenの場合はiconv()ローカルのwstringエンコーディングとUTF-8間の変換を行います(Unixでは、UTF-8をどこでも使用するのが一般的です。 UNIX側ではstd::stringのUTF-8テキストを含む)。

関連する問題