将单个字节字符串(半宽)转换为双字节(完整宽度)



最近我在C#应用程序中遇到了此代码。

cDataString = Strings.StrConv(cDataString, VbStrConv.Wide);

我了解StrConv是VB的字符串函数。您可以通过包括"使用Microsoft.visualBasic;"。

来调用它。

应该将日本字符覆盖为全宽的半宽度。

我的问题是:有没有一种方法可以在不使用VB函数的情况下实现相同的方法,也没有仅使用标准C#函数的VB标头?我知道有许多C#字符串转换功能,其中一些可以从Unicode转换为ANSI,反之亦然。但是我不确定其中任何一个是否会直接获得与上述VB完全相同的结果。那么,这可以在C#?

中完成

感谢您的时间和努力。

更新:我遇到了5年前提出的这个问题。答案和讨论确实显示了可以做到的一些方法。我特别想知道的是,经过5年和新版本,什么是,什么是在不依赖VB函数或VB库的情况下进行的。

c#。

中没有等效函数

如果您遵循Microsoft.VisualBasic.dllStrConv的源代码,您会看到它实际上是P/调用与您链接的答案的内部相似的LCMapString

如果您不想参考Microsoft.VisualBasic.dll,则可以将P/调用为C#编写的助手类或服务,类似这样...

// NOTE: CODE NOT TESTED
// Code from John Estropia's StackOverflow answer
// https://stackoverflow.com/questions/6434377/converting-zenkaku-characters-to-hankaku-and-vice-versa-in-c-sharp
public static class StringWidthHelper
{
    private const uint LOCALE_SYSTEM_DEFAULT = 0x0800;
    private const uint LCMAP_HALFWIDTH = 0x00400000;
    private const uint LCMAP_FULLWIDTH = 0x00800000;
    public static string ToHalfWidth(string fullWidth)
    {
        StringBuilder sb = new StringBuilder(256);
        LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_HALFWIDTH, fullWidth, -1, sb, sb.Capacity);
        return sb.ToString();
    }
    public static string ToFullWidth(string halfWidth)
    {
        StringBuilder sb = new StringBuilder(256);
        LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_FULLWIDTH, halfWidth, -1, sb, sb.Capacity);
        return sb.ToString();
    }
    [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
    private static extern int LCMapString(uint Locale, uint dwMapFlags, string lpSrcStr, int cchSrc, StringBuilder lpDestStr, int cchDest);
}

否则,您可以构建一个字典以充当查找表。

不是通用解决方案,而是在我的特殊情况下(日本katakana ラーメン to Full Width katakana ラーメン), String#Normalize带有NFKC选项。

请注意,此方法与VB ONE不完全兼容(例如,将全宽度42转换为半宽号42),因此您需要选择字符以替换为:

// Half-width katakana to Full-width katakana
Regex halfKatakana = new Regex(@"[uFF61-uFF9F]+");
cDataString = halfKatakana.Replace(cDataString, (m) => m.Value.Normalize(NormalizationForm.FormKC));

最新更新