私はクロスプラットフォームのC++プロジェクトに取り組んでいます。これはユニコードを考慮しておらず、ユニコードをサポートするための変更が必要です。
次の2つの選択肢があります。どちらを選択するかを決める必要があります。
したがって、項目#1 UTF8の場合、コードの変更が多すぎないという利点があります。しかし、懸念事項は、UTF8ではいくつかの基本的なルールが破られることです。たとえば、
これ以上の経験はありますか?そして、どれを選ぶべきですか?
UTF-8を使用します。string.size()
は、コードポイントの量に等しくありません、しかしそれはとにかくほとんど役に立たない指標です。ほとんどすべての場合、ユーザーが認識する文字/グリフの数(およびそのために、UTF-32は同じくらいひどく失敗します)、またはbytes使用ストレージ(このため、UTF-32は利点がなく、起動に多くのバイトを使用します)。
ASCII文字(_/
_など)の検索は、実際には他のエンコーディングよりも簡単です。バイト/ ASCIIベースの検索ルーチン(ターミネータが0の場合は古いC strstr
)。UTF-8は、すべてのASCII文字が同じバイト表現をUTF-で使用するように設計されています8、ASCII以外の文字は、ASCII文字とバイトを共有しません。
Windows APIはUTF-16を使用しており、UTF-16はstring.size() == code_point_count
も提供していません。また、多かれ少なかれ、UTF-32のすべての欠点を共有しています。さらに、アプリケーションにUnicodeを処理させることは、すべての文字列をUTF- {8,16,32}にすることほど単純ではないでしょう。 goodUnicodeサポートには、テキストの正規化、愚かなコードポイントの処理などのトリッキーロジックが必要になる場合があります(これは セキュリティの問題 になる場合があります)、文字列の作成スライスや反復などの操作は、バイトなどの代わりにグリフまたはコードポイントで機能します。
ここで合理的に説明できるよりも、UTF-8を使用する理由(およびUTF- {16,32}を使用しない理由)は他にもあります。さらに説得力が必要な場合は TF-8マニフェスト を参照してください。