2016-11-28 146 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