12

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

それで、誰かがライブラリが「8ビットインターフェース」(std::stringまたはconst char*)を提供し、「Unicode」文字列をサポートする方法を説明できますか?

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

4

3 に答える 3

8

まず、@quinmars が言ったように、utf-8 は const char * 文字列に格納されます。そして、それは 7 ビット ASCII のスーパーセット (コード ポイント <= 127 は、常にそれ自体として 1 バイトでエンコードされる) であるだけでなく、これらの値を持つバイトが、コード ポイントのマルチバイト値のエンコードの一部として決して使用されないように注意します。 >= 128. したがって、バイト == 44 が表示される場合、それは「<」文字などです。XML のすべてのメタ文字は 7 ビット ASCII です。したがって、XML を解析し、メタ文字が示す場所で文字列を分割し、フラグメント (おそらく非 ASCII 文字を含む) を char * または std::string に貼り付けることができ、返されたフラグメントは有効な UTF-8 文字列のままです。パーサーは特に UTF-8 を認識していませんでした。

さらに (XML に固有のものではありませんが、むしろ巧妙です)、さらに複雑な処理も一般的に機能します (tm)。たとえば、UTF-8 を辞書順にバイトで並べ替えると、コード ポイントで辞書順に並べ替えた場合と同じ結果が得られます。これは、使用されるバイト数の変動にもかかわらず、接頭辞のバイトがより長い (したがってより高い値の) コードを導入するためです。ポイントは、より小さい値のポイントよりも数値的に大きくなります)。

于 2008-09-28T23:49:50.633 に答える
2

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

于 2008-09-28T22:56:13.323 に答える
0

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

于 2008-09-28T23:43:08.357 に答える