7

任意の Unicode テキストをラップすることになっている端末 (コンソール) アプリケーションを作成しています。

端末は通常等幅 (固定幅) フォントを使用しているため、テキストを折り返すには、文字数を数え、単語が行に収まるかどうかを確認し、それに応じて動作するだけです。

問題は、端末で 2 文字の幅を占める Unicode テーブルに全角文字があることです。

これらを数えると 1 つの Unicode 文字が表示されますが、印刷された文字は 2 つの「通常の」(半角) 文字幅であり、幅の 2 倍の文字を認識しないため、ラッピング ルーチンが壊れます。

例として、これは全角文字 (U+3004、JIS 記号) です。

〄
12

フォーマット済みですが、ここでは 2 文字の全幅を占有しませんが、端末の西洋文字の 2 倍の幅を使用します。

これに対処するには、全角文字と半角文字を区別する必要がありますが、C++ でそれを行う方法が見つかりません。この問題を回避するには、Unicode テーブル内のすべての全角文字を知る必要がありますか?

4

2 に答える 2

6

プロパティでICUu_getIntPropertyValueを使用する必要がありUCHAR_EAST_ASIAN_WIDTHます。

例えば:

bool is_fullwidth(UChar32 c) {
    int width = u_getIntPropertyValue(c, UCHAR_EAST_ASIAN_WIDTH);
    return width == U_EA_FULLWIDTH || width == U_EA_WIDE;
}

グラフィック ライブラリが文字の組み合わせをサポートしている場合は、シーケンスが使用するセルの数を決定するときに、それらも考慮する必要があることに注意してください。たとえば、 COMBINING ACUTE ACCENT がe続くと、1 つのセルしか占有しません。U+0301

于 2013-02-27T14:24:48.443 に答える