5

私は初歩的な手書きの語彙スキャナーに取り組んでおり、UTF-8 入力をサポートしたいと考えています (もう 1970 年ではありません!)。入力文字はstdin、ファイルから一度に 1 つずつ読み取られ、空白が表示されるまでバッファーにプッシュされます。fgetc()代わりにchar[]、UTF-8 文字を構成するバイトを返し、文字列としての結果...十分に簡単ですが、滑りやすい斜面になります. 車輪の再発明に時間を無駄にするのではなく、代わりにICUのような既存のテスト済みライブラリを使用したいと思います。fgetc()これで、 、isspace()、で動作する非 UTF-8 サポート コードができました。strcmp()など、ICU を使用するために更新しようとしています。これは ICU での初めての試みであり、ドキュメントを読み、Google コード検索で使用例を見つけようとしていますが、まだ混乱している点がいくつかあります。誰かが明確にしてくれることを願っています。

このu_fgetc()関数は を返しUChar、そして... をu_fgetcx()返しますUChar32... ドキュメントu_fgetcx()ではコードポイントの読み取りに を使用することを推奨しているため、それから始めています。上記と同じアプローチを維持していますが、s のUChar32代わりに s をバッファーにプッシュしていcharます。

  • 文字を既知の値と比較する適切な方法は何ですか? もともとif (c == '+')、プラス記号が入力から取得されたかどうかを確認することができました。cGCCは a の場合に文句を言いません(これはとUChar32の比較です) が、これは本当に適切ですか?UChar32char

  • strcmp()バッファリングされた文字を既知の値と比較するために使用できましたif ((strcmp(buf, "else") == 0)。ICU から提供されており、既知のリテラルを指定するにはおよびマクロu_strcmp()を使用する必要があると思いますが、確かではありません。ドキュメンテーションは、それらが結果として. ここでのガイダンスは大歓迎です。U_STRING_DECLU_STRING_INITUChar[]UChar32[]

  • 一連の数字を読み取った後、それらを変換してstrtol()作業できるようにしました。現在コンバート中ですが、ICU で同様の機能が提供されてUChar32[]いますか?

4

2 に答える 2

5

UCharCode Unitを保持するためのもので、はCode PointUChar32を保持するためのものです。入力がBasic Multilingual Plane (BMP) にとどまる場合は で十分であり、実際にほとんどの ICU 機能は で動作します。UCharUChar[]

ICU ユーザー ガイドを読むことを強くお勧めします。このガイドでは、ほとんどの内部およびベスト プラクティスが説明されています。

  • Unicode 文字変数を既知の値と比較する適切な方法は何ですか? 文字 (またはUCharまたはUChar32) は、特定の幅と符号を持つ単なる別の整数型であり、通常の警告と制限付きで他の整数型と比較できます。文字値の定義に関しては、C99 (第 6.4.3 章) でUniversal character names notationが提供されています。 ISO/IEC 10646 の「短い識別子」を指定して、\uその後に 4 桁の 16 進数、または8 桁の 16 進数が続きます。\U0x00a0 より下の領域 ( 0x0024 '$'、 0x0040 '@'、および 0x0060 (バッククォート) を除く) は予約されています (ただし、単純な文字定数をUChar)。また、0xd800 から 0xdfff までの範囲も予約されています (UTF-16 で使用するため)。

  • Unicode 文字列リテラルを定義するには? 本当にあなたが探しているものですU_STRING_DECLU_STRING_INIT(上記のように、ICU は主に で動作しUChar[]ます。) C の代わりに C++ を使用している場合は、 (オプションでto yield againUNICODE_STRING_SIMPLEが続きます) を使用すると、Unicode 文字列リテラルを定義するはるかに快適な方法が提供されます。getTerminatedBuffer()UChar[]

  • 数値を表す Unicode 文字列をその数値の値に変換する方法は? unum_parse()そして、その同胞unum.hがそこであなたを助けます。

于 2011-06-01T05:33:00.300 に答える
2
  1. PLUS SIGN の Unicode 値は U+002B で、'+' の通常の (Latin-1) 値も 0x2B (053, 43) です。コードセットがASCIIまたはISO-8859-xに基づいている場合、あなたが書いたものは十分に安全です。\u0123C99 標準では、および(4 桁と 8 桁の 16 進数)の形式の Unicode (ユニバーサル文字名)が規定されていますが、 など、\U00102345未満の値を指定することはできないと規定されています。ですから、あなたの書いていることは正しいと思います。\u00A0\u002B

    enumただし、次のようなものを使用することで、将来の不安を救うことができます

     enum { PLUS_SIGN = '+' };
    

    適切なヘッダーで定義され、リテラルのプラス記号が必要な場所で使用されます。そうすれば、あなたの仮定 (および私の仮定) が間違っていても、編集する場所が 1 つあります - ヘッダーです。

    Strings with ICU のページでは、アプリケーションで UTF-32 を使用することは珍しいことを示唆していることに注意してください。

  2. 純粋な C では、システム上の がand/or UChar32 と同等でwcscmp(buf, L"else")あると仮定して、おそらく を使用するでしょう。and を使用してUTF -32 文字列を作成する方法があるようです。もっときれいな方法もあるかもしれません。wchar_tuint32_tUnicodeStringUNICODE_STRING("...")ToUTF32()

  3. 書式設定と解析の両方を処理する「書式設定」クラスがあります。おそらく、クラスから派生したクラスを使用するでしょうNumberFormat

于 2011-06-01T05:39:46.050 に答える