日文Windows操作系统上的C#应用程序-将拉丁语表示为全宽字符

日文Windows操作系统上的C#应用程序-将拉丁语表示为全宽字符,c#,cjk,C#,Cjk,我有一个C#winform应用程序,安装在日本的Windows7上。 一些标签的字体非常宽,导致它们的大小与标签的大小不同 经过一些研究后,我被告知这可能是一个半幅/全幅的问题。 有没有办法强制所有字符串都显示为半宽度 例如,此零件未正确显示: modelSizeLabel.Text = String.Format("X:{0:0.0},Y:{1:0.0},Z:{2:0.0} [{3}]", (Model.BBox.dx), (M

我有一个C#winform应用程序,安装在日本的Windows7上。 一些标签的字体非常宽,导致它们的大小与标签的大小不同

经过一些研究后,我被告知这可能是一个半幅/全幅的问题。 有没有办法强制所有字符串都显示为半宽度

例如,此零件未正确显示:

modelSizeLabel.Text = String.Format("X:{0:0.0},Y:{1:0.0},Z:{2:0.0} [{3}]", 
                (Model.BBox.dx),
                (Model.BBox.dy),
                (Model.BBox.dz - Model.Sink),
                uc.To.ToString() //units enum
                );

基本上,我知道有两种处理全宽字母的方法:

1。使用方法

此方法在将全宽(尖阁)转换为半宽(hankaku)时使用标准:

注:这被认为是转换用日语输入法编写的ANSI编码所涵盖的字母、数字和标点符号的最简单方法,但我仍然不知道它对任何假名/汉字字母有何影响

2。在kernel32.dll中使用P/Invoke调用
LCMapString
方法

这种方法需要调用外部DLL资源
kernel32.DLL
,并在函数中定义标志(注意,有些标志是互斥的,实现归功于rshepp/John Estropia):

用法示例:

// by default Japanese IME automatically convert all vocal letters to respective kana letters, 
// so I used consonants except "n"
Label1.Text = ToHalfWidth("0123456789bcdfghjklmpqrstvwxyz");
Label2.Text = ToHalfWidth("0123456789bcdfghjklmpqrstvwxyz", 256);
PS:您可以将上述两个方法包装在一个helper/服务类中,以便跨同一命名空间使用

相关问题:


显示标签代码
String.Normalize(System.Text.NormalizationForm.FormKC)
可以解决您的问题。假设使用了全半角字母,它可以在显示到标签之前自动转换。谢谢,我应该分别为每个sting执行此操作吗?AFAIK有两种方法,一种是使用
Normalize
,另一种是使用P/Invoke。根据要使用半角的内容,您可以创建一个方法来使用它。在我看来,String.Format()不太可能生成全宽字符。它当然不会在我的机器上与ja-JP一起生效。更有可能的是,您使用的字体被重新映射到另一个字体。一个用户可能更喜欢的。请注意,机器实际上并没有“微软SAN-serif”,而是考虑选择另一个。也许“代码>规范化(RealMigStase.FrimkC)< /C>和 LCMAPSTRing()/Case>以相同的方式工作,不是吗?它们可能以类似的方式和概念工作,在那里,代码> String。方法使用对基本.NET库的直接访问,而
LCMapString
使用本机Windows API处理。
// edited from /a/40836235
private const uint LOCALE_SYSTEM_DEFAULT = 0x0800;
private const uint LCMAP_HALFWIDTH = 0x00400000;

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
private static extern int LCMapString(uint Locale, uint dwMapFlags, string lpSrcStr, int cchSrc, StringBuilder lpDestStr, int cchDest);

public static string ToHalfWidth(string fullWidth, int size)
{
    StringBuilder sb = new StringBuilder(size);
    LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_HALFWIDTH, fullWidth, -1, sb, sb.Capacity);
    return sb.ToString();
}
// by default Japanese IME automatically convert all vocal letters to respective kana letters, 
// so I used consonants except "n"
Label1.Text = ToHalfWidth("0123456789bcdfghjklmpqrstvwxyz");
Label2.Text = ToHalfWidth("0123456789bcdfghjklmpqrstvwxyz", 256);