2

一部のRightToLeft言語 (アラビア語、ペルシャ語、ウルドゥー語など) では、各文字が異なる形になる場合があります。分離形、初期形、中間形があります (どの Unicode フォントについても、ウィンドウの文字マップで見つけることができます)。

ユーザーがテキスト ボックスに入力した正確な文字が必要だと想像してください。デフォルトでは、文字列を CharArray に変換すると、各文字が分離形式に変換されます。

(ユーザーがキーボードで文字を入力すると、それは分離された形式になり、画面に表示されると適切な形式に変換されるためです。これは単なる推測です。正確な文字コードを使用して文字列を作成する場合、適切な配列を生成します)。

私の質問は、テキスト ボックスに表示されている形式の文字列をどのように取得できるかということです。

.NETに方法がない場合、これは、このT_Tを変換するために独自のクラスを作成する必要があることを意味します

4

3 に答える 3

3

Windows はUniscribeを使用して、複雑なスクリプトのコンテキスト シェーピングを実行します (これは、 l-to-r言語とr-to-l言語に適用できます)。テキスト ボックスに表示されるテキストは、文字が Uniscribe に入力された後のグリフ情報に基づいています。Unicode 標準では、文字の分離形、初期形、中間形、および最終形のそれぞれにコード ポイントが定義されていますが、必ずしもすべてのフォントがそれらをサポートしているわけではありません。フォントの cmap に基づいて、使用するグリフを決定するための Windows 言語パック。関連するリンクを次に示します。

TextRenderer .DrawText ()メソッドは、次の P/Invoke を使用して、Win32 DrawTextExW()関数を介して Uniscribe を使用します。

[DllImport("user32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
public static extern int DrawTextExW( HandleRef hDC
                                     ,string lpszString
                                     ,int nCount
                                     ,ref RECT lpRect
                                     ,int nFormat
                                     ,[In, Out] DRAWTEXTPARAMS lpDTParams);

[StructLayout(LayoutKind.Sequential)]
public struct RECT
 {
   public int left;
   public int top;
   public int right;
   public int bottom;
 }

[StructLayout(LayoutKind.Sequential)]
public class DRAWTEXTPARAMS
{
  public int iTabLength;
  public int iLeftMargin;
  public int iRightMargin;
  public int uiLengthDrawn;
}
于 2009-07-23T07:08:02.097 に答える
0

これはちょっと大げさな推測ですが、String.Normalize() はここで役に立ちますか? それがキャラクターの構成だけをカバーしているのか、それとも位置的なフォームも含まれているのかは私には不明です.

于 2009-07-23T06:27:57.463 に答える
0

では、「間違った」文字列をどのように作成していますか? 文字列リテラルに入れているだけの場合は、入力方法が間違っている可能性が非常に高くなります。表示後に「正しい」文字列をコピーし、それを文字列リテラルに貼り付けるとどうなりますか? また、Visual Studio がソース ファイルに使用しているエンコードを確認することもできます。文字列をリテラルとしてソース コードに入れていない場合、どのように作成していますか?

混乱の可能性を考えると、これらの文字列をリソースに保持するか、Unicode エスケープを使用してハードコーディングする必要があると思います。

string text = "\ufb64\ufea0\ufe91\ufeea";

(その後、エスケープされていない値を示すコメントを後で入れることができます。少なくとも、それがほぼ正しいように見える場合、誤解を招くことはありません確かに、2つが同期しなくなるのは簡単です...)

于 2009-07-23T05:23:36.737 に答える