我有一个C#winform应用程序,安装在日语windows 7上。 有些标签带有非常宽的字体,导致它们的尺寸不同于。
经过一些研究后,我被告知这可能是一半/全宽问题。 有没有办法强制所有字符串显示为半宽?例如,此部分未正确显示:
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
);
答案 0 :(得分:1)
基本上我知道处理全角字母有两种方法:
<强> 1。使用String.Normalize()方法
此方法在将全角(zenkaku)转换为半角(hankaku)时使用标准Unicode normalization forms:
public static string ToHalfWidth(string fullWidth)
{
return fullWidth.Normalize(System.Text.NormalizationForm.FormKC);
}
注意:这被认为是转换用日语IME编写的ANSI编码所涵盖的字母,数字和标点符号的最简单方法,但我仍然不知道它如何影响任何假名/汉字字母。
<强> 2。使用P / Invoke调用kernel32.dll中的LCMapString
方法
此方法需要使用API method LCMapString
调用外部DLL资源kernel32.dll
,并在LCMapStringEx
函数中定义标志(请注意,某些标志是互斥的,实现信誉为 rshepp / John Estropia ):
// 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);
PS:您可以将上述两种方法包装在一个帮助程序/服务类中,以便在同一名称空间中使用。
相关问题:
Converting zenkaku characters to hankaku and vice-versa in C#
Convert single byte character string (half width) to double byte (full width)