1

さまざまな言語のローカライズされた文字列を含むことができるXMLファイルを解析しています(現時点では英語とスペイン語ですが、将来的には任意の言語になる可能性があります)、XMLパーサーのAPIはXML内のすべてのデータをUTF8でエンコードされたchar*。

データが解析された後、データを操作する必要があります(データ内でサブ文字列を検索する、文字列を連結する、サブ文字列の長さを決定するなど)。

strlen、strcatなどの標準関数を使用すると便利です。XMLパーサーから受け取る生データはchar *であるため、これらの標準文字列処理関数を使用してすべての操作を簡単に行うことができます。

ただし、これらはすべて、もちろん、文字列がNULLで終了するという仮定と要件を満たしています。したがって、私の質問は、char *として表される幅の広いデータがある場合、NULLターミネータ文字をデータの最後ではなくデータ内で使用できるかどうかです。

つまり、特定の言語の文字がそれを表すのに2バイトを必要とせず、1バイトで表される場合、他のバイトはNULLになるのでしょうか。

4

2 に答える 2

3

UTF-8は「ワイド」ではありません。UTF-8はマルチバイトエンコーディングであり、Unicode文字は1〜4バイトかかる場合があります。UTF-8には、有効な文字内にゼロターミネータがありません。パーサーが提供するものについて混乱しないようにしてください。UTF-16またはUCS2、あるいはそれらに相当する4バイトをワイド文字列に配置することができます。その場合、それらをワイド文字列として扱う必要があります。

于 2011-06-02T18:12:51.810 に答える
0

Cは、マルチバイト文字ワイド文字を区別します。

  • ワイド文字は、まったく同じバイト数を使用して実行文字セットの任意の文字を表現できる必要があります(たとえば、兀が表現されるのに4バイトかかる場合、Aも表現されるのに4バイトかかる必要があります)。ワイド文字エンコーディングの例は、UCS-4および非推奨のUCS-2です。

  • マルチバイト文字は、表現されるバイト数を変えることができます。マルチバイトエンコーディングの例は、UTF-8およびUTF-16です。

UTF-8を使用する場合は、引き続き関数を使用できますが、文字列の長さを文字数str*で返す方法がないことに注意する必要があります。ワイド文字に変換して、を使用する必要があります。文字ではなくバイト単位で長さを返します。これはさまざまな状況で役立ちます。wcslenstrlen

実行文字セットのすべての要素を、バイト単位で事前定義されたサイズの単一のワイド文字に表す必要があることを強調することはできません。一部のシステムはワイド文字にUTF-16を使用しているため、実装がC標準に準拠できず、一部のwc*関数が正しく機能しない可能性があります。

于 2011-06-02T19:21:02.917 に答える