質問

TinyXML を使用してXMLファイルを解析/構築しています。現在、ドキュメントによると、このライブラリはUTF-8を介したマルチバイト文字セットをサポートしています。これまでのところ、私は思う。ただし、ライブラリが提供する唯一のAPI(要素名、属性名、および値の取得/設定用...文字列が使用されるすべて)は、std::stringまたはconst char*を介してのみです。これは、マルチバイト文字セットのサポートに関する自分自身の理解を疑っています。 8ビット文字のみをサポートする文字列には、16ビット文字を含めることができます(「Unicodeをサポートする」という主張を無効にするコードページを使用しない限り)。理論的には16ビットのコードポイントを取得して<=>で2文字に分割できることを理解していますが、それは<=>を「Unicode」文字列に変換せず、ほとんどの目的で無効になりますファイルに書き込んで別のプログラムで読み込んだときに偶然に動作する可能性があります。

では、誰かがライブラリに「8ビットインターフェイス」(<=>または<=>)を提供し、「Unicode」文字列を引き続きサポートする方法を説明できますか?

(おそらくここでいくつかのUnicode用語を混同しました;それから来る混乱については申し訳ありません)。

役に立ちましたか?

解決

まず、@ quinmarsが言ったように、utf-8はconst char *文字列に保存されます。また、7ビットASCIIのスーパーセット(コードポイント<!> lt; = 127は常に単一バイトで常にエンコードされる)だけでなく、これらの値を持つバイトがマルチバイトのエンコードの一部として使用されないようにさらに注意しますコードポイントの値は<!> gt; = 128です。したがって、バイト== 44が表示されている場合は、 '<!> lt;'です。文字など。XMLのすべてのメタ文字は7ビットASCIIです。そのため、XMLを解析して、メタ文字が言うところの文字列を壊し、フラグメント(非ASCII文字を含む可能性がある)をchar *またはstd :: stringに貼り付け、返されたフラグメントは有効なUTF-8文字列のままですパーサーはUTF-8を特に知りませんでした。

さらに(XMLに固有ではなく、むしろ賢い)、さらに複雑なものは一般的に機能します(tm)。たとえば、バイトでUTF-8を辞書式に並べ替えると、使用されるバイト数の違いにかかわらず、コードバイトで辞書式に並べ替えた場合と同じ答えが得られます。これは、プレフィックスバイトが長い(したがって値の大きい)コードを導入するためですポイントは、値が小さい場合よりも数値的に大きくなります)。

他のヒント

UTF-8は7ビットASCIIコードと互換性があります。バイトの値が127より大きい場合、マルチバイト文字が開始することを意味します。最初のバイトの値に応じて、文字のバイト数を確認できます。最初のバイトを含む2〜4バイトです(技術的には5または6も可能ですが、utf-8は無効です)。 UTF-8に関する優れたリソースは次のとおりです。 UTF-8およびUnicode FAQ 、utf8のWikiページも非常に有益です。 UTF-8は文字ベースで0で終わるため、ほとんどの場合に標準の文字列関数を使用できます。唯一重要なことは、文字数がバイト数と異なる場合があることです。 strlen()などの関数は、バイト数を返しますが、必ずしも文字数を返しません。

1〜4文字を使用して、1つのUnicodeコードポイントをエンコードします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top