gpt4 book ai didi

c# - 如何在复杂的脚本中获取上下文输入的字符?

转载 作者:行者123 更新时间:2023-11-30 22:49:24 25 4
gpt4 key购买 nike

在某些RightToLeft 语言(如阿拉伯语、波斯语、乌尔都语等)中,每个字母可以有不同的形状。有孤立形、首字母和中间形(任何unicode字体你都可以在windows的字符映射表上找到)。

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

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

我的问题是,我们如何才能得到字符串的那种形式,即已经显示在文本框中的形式。

如果 .NET 中没有办法那么这意味着我需要创建自己的类来转换此 T_T

最佳答案

Windows 使用 Uniscribe为复杂脚本执行上下文塑造(可应用于l-to-r 以及r-to-l 语言)。文本框中显示的文本基于字符输入 Uniscribe 后的字形信息。尽管 Unicode 标准为字符的每个孤立形式、初始形式、中间形式和最终形式定义了代码点,但并非所有字体都必须支持它们,但它们可能具有预成型的字形或使用字形的组合——Uniscribe 使用来自Windows 语言包根据字体的 cmap 确定要使用的字形。以下是一些相关链接:

TextRenderer .DrawText() 方法通过 Win32 DrawTextExW() 函数使用 Uniscribe,使用以下 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;
}

关于c# - 如何在复杂的脚本中获取上下文输入的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1169709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com