代码之家  ›  专栏  ›  技术社区  ›  MJ Fathinia

如何获取复杂脚本中上下文形状输入的字符?

  •  2
  • MJ Fathinia  · 技术社区  · 16 年前

    在一些 右倾的 语言(如阿拉伯语、波斯语、乌尔都语等)每个字母可以有不同的形状。有独立形式、初始形式和中间形式(您可以在任何Unicode字体的Windows字符映射中找到它)。

    假设您需要用户在文本框中输入的确切字符,默认情况下,当您将字符串转换为chararray时,它会将每个字符转换为独立的形式。

    (因为当用户通过键盘输入字符时,它是独立的形式,当它在屏幕上显示时,它将被转换为正确的格式;这只是一个猜测。因为如果使用精确的字符代码生成字符串,它将生成正确的数组)。

    我的问题是,我们如何得到字符串的形式,即文本框中显示的形式。

    如果在.NET中没有任何方法,那么这意味着我需要创建自己的类来转换这个t\u

    3 回复  |  直到 16 年前
        1
  •  3
  •   Community CDub    11 年前

    Windows使用 Uniscribe 表演 语境塑造 对于复杂脚本(可应用于 L to R 以及 RT-L 语言)。文本框中显示的文本基于字符被输入uniscribe后的字形信息。虽然Unicode标准为Chracter的每个独立、初始、中间和最终形式定义了代码点,但并非所有字体都必须支持它们,但它们可能具有预成形的字形或使用字形的组合。Uniscribe使用Windows语言包中的造型引擎根据字体CMAP以下是一些相关链接:

    这个 TextRenderer 绘制文本() 方法通过win32使用uniscribe DouthTeXTWWW() 函数,使用以下p/invoke:

    [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;
    }
    
        2
  •  0
  •   Jon Skeet    16 年前

    那么,您是如何创建“错误”字符串的呢?如果您只是把它放在一个字符串文字中,那么很可能只是输入方法出错了。如果在显示后复制“right”字符串,然后将其粘贴到字符串文字中,会发生什么?您可能还需要检查Visual Studio对源文件使用的编码。如果你是 将字符串作为文本放入源代码中,如何创建它?

    考虑到混淆的可能性,我想要么将这些字符串保留在资源中,要么使用Unicode转义对它们进行硬编码:

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

    (然后可能在后面放一条注释,显示未转义的值;至少如果它看起来正确,它将不会 误导。诚然,这两个人很容易失去同步……)

        3
  •  0
  •   DocMax    16 年前

    这有点疯狂,但string.normalize()在这里有帮助吗?我不清楚这是否仅仅包括了角色构成,或者是否也包括了位置形式。