最近我在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.dll
的StrConv
的源代码,您会看到它实际上是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));