後でLinuxプラットフォームにも移行することを目的として、Windowsでテキストサポートを実装しようとしています。国際言語を統一的にサポートすることが理想的ですが、問題の2つのプラットフォームを考慮すると、それは簡単には達成できないようです。UNICODE、UTF-8(およびその他のエンコーディング)、widecharsなどについてかなりの時間を費やしてきましたが、これまでに理解したことは次のとおりです。
UNICODEは、標準として、マップ可能な文字のセットとそれらが出現する順序を記述します。私はこれを「何」と呼んでいます。UNICODEは何が利用可能になるかを指定します。
UTF-8(およびその他のエンコーディング)は、次の方法を指定します。各文字をバイナリ形式で表現する方法。
現在、Windowsでは、元々UCS-2エンコーディングを選択していましたが、要件を満たせなかったため、UTF-16があり、必要に応じて複数文字も使用できます。
だからここにデレンマがあります:
- Windowsは内部的にUTF-16のみを実行するため、国際文字をサポートする場合は、それに応じてOS呼び出しを使用するためにwidecharバージョンに変換する必要があります。マルチバイトのUTF-8文字列を使用してCreateFileA()のようなものを呼び出し、適切に表示されるようにするためのサポートはないようです。これは正しいです?
- Cには、いくつかのマルチバイトサポート関数(_mbscat、_mbscpyなど)がありますが、Windowsでは、文字タイプはそれらの関数のunsignedchar*として定義されます。_mbsシリーズの関数が完全なセットではない(つまり、マルチバイト文字列をlongに変換する_mbstolがない)という事実を考えると、ランタイム関数のchar*バージョンの一部を使用する必要があります。これらの関数間の符号付き/符号なしの型の違いにより、コンパイラの問題が発生します。誰かがそれらを使用していますか?エラーを回避するために、大量のキャストを行うだけですか?
- C ++では、std :: stringにイテレータがありますが、これらはコードポイントではなく、char_typeに基づいています。したがって、std :: string :: iteratorで++を実行すると、次のコードポイントではなく、次のchar_typeが取得されます。同様に、std :: string :: operator []を呼び出すと、char_typeへの参照が取得されます。これは、完全なコードポイントではない可能性が非常に高くなります。では、コードポイントごとにstd :: stringをどのように繰り返すのでしょうか?(Cには_mbsinc()関数があります)。