日文Windows操作系统上的C#应用程序-将拉丁语表示为全宽字符
我有一个C#winform应用程序,安装在日本的Windows7上。 一些标签的字体非常宽,导致它们的大小与标签的大小不同 经过一些研究后,我被告知这可能是一个半幅/全幅的问题。 有没有办法强制所有字符串都显示为半宽度 例如,此零件未正确显示:日文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
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
使用本机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);