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

时间:2017-05-03 07:37:07

标签: c# cjk

我有一个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
                );

1 个答案:

答案 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)