2016-11-28 28 views
2

最近我在C#应用程序中遇到此代码。将单字节字符串(半宽)转换为双字节(全宽)

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

据我所知,StrConv是VB的字符串函数。你可以通过包含'using Microsoft.VisualBasic'来调用它。

它应该将半角宽度的日文字符转换为全角字符。

我的问题是: 有没有办法使用VB函数和不包括VB头,只使用标准的C#函数来实现相同的WITHOUT?我知道有很多c#字符串转换函数,其中一些可以从unicode转换为ansi,反之亦然,等等。但我不确定是否有任何人会直接得到与上述VB完全相同的结果。那么,这可以在C#中完成吗?

谢谢你的时间和精力。

更新: 我碰到了5年前问过的this question。答案和讨论确实展示了可以完成的一些方法。我特别想知道的是,经过5年和新版本以及什么不是,有没有一种更简单和更好的方式来在.NET中执行此操作,而不依赖于VB函数或VB库?

+0

我不认为有这样的事情“标准的C#功能”。 AFAIK对'Microsoft.VisualBasic'的引用与引用添加到C#项目的'Microsoft.CSharp'一样正常。也许这可以帮助http://stackoverflow.com/questions/25149458/convert-fullwidth-to-halfwidth。我个人将对Microsoft.VisualBasic的引用添加到几乎所有的C#项目中,因为C#在习惯VB之后可能会感觉有点欠缺。 – Slai

+0

谢谢Slai。通过标准的C#函数,我的意思是常见的'System.xxx'.Net函数。在习惯了VB之后,你可能会觉得C#有点欠缺。但不幸的是,我不知道VB.I更喜欢C#.Net,并且对于某些真正老的和持续的项目,C++ MFC。它确实是StrConv完成了工作,但我不喜欢include部分中的'Microsoft.VisualBasic',我对它提供的功能没有任何想法,所以我想删除它可能。 – PRinCEKtd

回答

2

C#中没有等价的函数。

如果按照Microsoft.VisualBasic.dllStrConv的源代码,你会看到它实际上是P /调用LCMapString内部类似answer you linked

如果你不想引用Microsoft.VisualBasic.dll,你可以换的的P/Invoke到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); 
} 

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

+0

非常感谢,rshepp。 而不是字典,我更喜欢你的助手类的想法。并且非常感谢示例代码。我会尝试这个想法,看看我能用它做什么。 – PRinCEKtd