3

印刷する前に、テキストの方向を知る必要があります。

Unicode文字を使用しています。

C ++でそれを行うにはどうすればよいですか?

4

4 に答える 4

6

ICUを使用したくない場合は、いつでも手動でUnicodeデータベースを解析できます(たとえば、Pythonスクリプトを使用)。これはセミコロンで区切られたテキストファイルであり、各行は文字コードポイントを表します。各行の5番目のレコードを探します-それは文字クラスです。Rまたはの場合AL、RTL文字があり、「L」はLTR文字です。他のクラスは弱いタイプまたはニュートラルタイプ(数字など)ですが、無視したいと思います。その情報を使用して、すべてのRTL文字のルックアップテーブルを生成し、それをC++コードで使用できます。コードサイズが本当に気になる場合は、ほとんどの文字がBiDiクラスのブロックに含まれているため、(各文字のエントリではなく)範囲を使用して、ルックアップテーブルがコードに取り込むサイズを最小限に抑えることができます。

次に、ルックアップテーブルをチェックしてGetCharDirection(wchar_t ch)、列挙値(たとえば、、、または)を返すDir_LTRというDir_RTL関数を定義します。Dir_Neutral

GetStringDirection(const wchar_t*)これで、Dir_Neutral以外の文字に遭遇するまで、文字列内のすべての文字を実行する関数を定義できます。文字列のこの最初の非中立文字は、その文字列の基本方向を設定する必要があります。または、少なくともそれがICUの動作のようです。

于 2011-04-12T14:35:36.607 に答える
5

そのための関数( ubidi_getDirection ubidi_getBaseDirection )を備えたICUライブラリを使用できます。

ICUのサイズは、データライブラリ(通常は約15MBの大きさ)を再コンパイルして、プロジェクトに必要なコンバーター/ローカルのみを含めることで削減できます。

ICUのデータのサイズを縮小する:サイトhttp://userguide.icu-project.org/icudataの変換テーブルのセクションには、データライブラリのサイズを縮小する方法に関する情報が含まれています。

最も一般的なエンコーディング(US-ASCII、ISO-8859-1、UTF-7 / 8/16/32、SCSU、BOCU-1、CESU-8)のサポートのみが必要な場合は、データライブラリは必要ありません。

于 2011-03-24T19:04:37.840 に答える
2

Boaz Yanivが以前に言ったように、おそらくこのようなものはファイル全体を解析するよりも簡単で高速です。

int aft_isrtl(int c){
  if (
    (c==0x05BE)||(c==0x05C0)||(c==0x05C3)||(c==0x05C6)||
    ((c>=0x05D0)&&(c<=0x05F4))||
    (c==0x0608)||(c==0x060B)||(c==0x060D)||
    ((c>=0x061B)&&(c<=0x064A))||
    ((c>=0x066D)&&(c<=0x066F))||
    ((c>=0x0671)&&(c<=0x06D5))||
    ((c>=0x06E5)&&(c<=0x06E6))||
    ((c>=0x06EE)&&(c<=0x06EF))||
    ((c>=0x06FA)&&(c<=0x0710))||
    ((c>=0x0712)&&(c<=0x072F))||
    ((c>=0x074D)&&(c<=0x07A5))||
    ((c>=0x07B1)&&(c<=0x07EA))||
    ((c>=0x07F4)&&(c<=0x07F5))||
    ((c>=0x07FA)&&(c<=0x0815))||
    (c==0x081A)||(c==0x0824)||(c==0x0828)||
    ((c>=0x0830)&&(c<=0x0858))||
    ((c>=0x085E)&&(c<=0x08AC))||
    (c==0x200F)||(c==0xFB1D)||
    ((c>=0xFB1F)&&(c<=0xFB28))||
    ((c>=0xFB2A)&&(c<=0xFD3D))||
    ((c>=0xFD50)&&(c<=0xFDFC))||
    ((c>=0xFE70)&&(c<=0xFEFC))||
    ((c>=0x10800)&&(c<=0x1091B))||
    ((c>=0x10920)&&(c<=0x10A00))||
    ((c>=0x10A10)&&(c<=0x10A33))||
    ((c>=0x10A40)&&(c<=0x10B35))||
    ((c>=0x10B40)&&(c<=0x10C48))||
    ((c>=0x1EE00)&&(c<=0x1EEBB))
  ) return 1;
  return 0;
}
于 2012-03-05T02:48:58.970 に答える
-1

Windows GDIを使用している場合、GetFontLanguageInfo(HDC)はDWORDを返すように見えます。GCP_REORDERが設定されている場合、言語を表示するには、ヘブライ語やアラビア語などの順序を変更する必要があります。

于 2011-11-12T20:10:48.350 に答える