私はWindowsでテキストサポートを実装しようとしており、後でLinuxプラットフォームに移行する予定です。国際的な言語を統一的にサポートすることは理想的ですが、問題の2つのプラットフォームを考慮すると容易には実現できないようです。私はUNICODE、UTF-8(および他のエンコーディング)、widecharsなどを読んでかなりの時間を費やしてきましたが、これまでに理解したことがあります:ユニコード、UTF-8、Windowsの混乱
UNICODEは、マッピング可能な文字とその順序が表示されます。私はこれを "何"と呼んでいるのですか:ユニコードはを指定しています。何がになるでしょうか。
UTF-8(および他のエンコーディング)は、の指定方法を指定します。:各文字のバイナリ形式の表現方法。
Windowsでは、もともとはUCS-2エンコーディングを選択していましたが、要件を満たせなかったため、UTF-16が必要です。だからここ
はdelemmaです:
- は、Windowsは、内部のみUTF-16を行いますので、あなたは、国際的な文字をサポートしたい場合は、OSがそれに応じて呼び出しを使用するために彼らのWIDECHARバージョンに変換することを余儀なくされています。 CreateFileA()のようなものをマルチバイトのUTF-8文字列で呼び出すことは適切ではないようです。これは正しいです?
- Cでは、いくつかのマルチバイトのサポート関数(_mbscat、_mbscpyなど)がありますが、ウィンドウでは文字型はunsigned char *として定義されています。 _mbsの一連の関数が完全なセットではないという事実(例えば、マルチバイト文字列をlongに変換するための_mbstolはありません)を考えると、ランタイム関数のchar *バージョンのいくつかを強制的に使用することになります。これらの関数間の符号付き/符号なし型の違いにより、コンパイラの問題が発生します。誰もそれらを使用していますか?あなたはエラーを回避するために鋳造の大きな山をしていますか?
- C++では、std :: stringにはイテレータがありますが、これはコードポイントではなくchar_typeに基づいています。したがって、私がstd :: string :: iteratorで++を実行した場合、次のコードポイントではなく次のchar_typeを取得します。同様に、std :: string :: operator []を呼び出すと、完全なコードポイントではない可能性のあるchar_typeへの参照が得られます。だから、コードポイントでstd :: stringをどのように反復するのでしょうか? (Cには_mbsinc()関数があります)。
「必要に応じてマルチバイト」ではありません。それはちょうど "マルチバイト"です。あなたがそれを処理し始めるまで、それが「必要」かどうかは分かりません。 –
ここにはこの件に関する[私の投稿](http://stackoverflow.com/questions/6300804/wchars-encodings-standards-and-portability)があります。おそらくそれはあなたの興味です。 (3)では、あなたのデータをUTF-32(理想的には 'char32_t'に格納されている)に変換し、コードポイントは文字列要素と同じです。 –
また、コードポイントでUnicode文字列を反復する正当な理由はほとんどないことに留意してください。なぜなら、書記素は複数のコードポイント(それぞれがUTF-8またはUTF-16で複数のコードユニットになることができますが、多くの実用的な目的は同じ問題を二度繰り返す)。正規化は正当な理由の1つで、UTF-8へのエンコーディングは別のものですが、これらはあなたがライブラリを使用できるものです。 –