2012-08-02 101 views
1

我有一個字符串在VB.net可能包含類似以下:混合編碼爲字符串

這是一個0x000020AC符號

這是UTF-32編碼爲歐根據這篇文章符號http://www.fileformat.info/info/unicode/char/20ac/index.htm

我想這個轉換成

這是在VB.net一個€符號

我使用UnicodeEncoding()類試過(Framework 2.0的,因爲我修改遺留應用程序)

當我使用這個類來編碼,然後解碼我仍然回到原來的字符串。

我預計UnicodeEncoding會識別已編碼的部分,而不是對其進行編碼。但似乎並非如此。

我現在有點失落,至於如何將混合編碼字符串轉換爲普通字符串。

背景:將Excel電子表格保存爲CSV時,ascii範圍外的任何內容都將轉換爲?。所以我的想法是,如果我可以讓我的客戶端搜索/替換諸如歐元符號之類的幾個字符爲編碼字符串,例如0x000020AC。然後我希望在插入到SQL數據庫之前將這些編碼部分轉換回真實符號。

我已經試過這樣的功能

Public Function Decode(ByVal s As String) As String 
    Dim uni As New UnicodeEncoding() 
    Dim encodedBytes As Byte() = uni.GetBytes(s) 
    Dim output As String = "" 

    output = uni.GetString(encodedBytes) 

    Return output 
End Function 

這是基於MSDN上的例子在http://msdn.microsoft.com/en-us/library/system.text.unicodeencoding.aspx

這可能是因爲我的是如何工作的一個完整的錯誤認識VB.net。在C#中,我可以簡單地使用諸如「\ u20AC」之類的轉義字符。但VB.net中不存在這樣的事情。

+1

我會使用[Regex.Replace](http://msdn.microsoft.com/en-us/library/ht1sxswy(V = VS.80)的.aspx)來匹配'0X ...'並使用自定義匹配評估器將匹配的值轉換回字符。 – Heinzi 2012-08-02 10:49:00

+0

[如何在VB.Net字符串文字中表示Unicode Chr代碼?](http://stackoverflow.com/questions/3144053/how-to-represent-unicode-chr-code-in-vb-net-字符串文字) – 2012-08-02 11:27:05

回答

1

基於Heinzi的建議我使用下面的代碼實現了一個Regex.Replace方法,這似乎適用於我的示例。

Public Function Decode(ByVal s As String) As String 
Dim output As String = "" 
Dim sRegex As String = "0x[0-9a-zA-Z]{8}" 

Dim r As Regex = New Regex(sRegex) 

Dim myEvaluator As MatchEvaluator = New MatchEvaluator(AddressOf HexToString) 

output = r.Replace(s, myEvaluator) 

Return output 
End Function 

Public Function HexToString(ByVal hexString As Match) As String 
Dim uni As New UnicodeEncoding(True, True) 
Dim input As String = hexString.ToString 
input = input.Substring(2) 
input = input.TrimStart("0"c) 

Dim output As String 

Dim length As Integer = input.Length 
Dim upperBound As Integer = length \ 2 
If length Mod 2 = 0 Then 
    upperBound -= 1 
Else 
    input = "0" & input 
End If 
Dim bytes(upperBound) As Byte 
For i As Integer = 0 To upperBound 
    bytes(i) = Convert.ToByte(input.Substring(i * 2, 2), 16) 
Next 

output = uni.GetString(bytes) 

Return output 
End Function 
+0

+1,感謝您分享您的解決方案! – Heinzi 2012-08-03 15:36:53

0

你試過:

Public Function Decode(Byval Coded as string) as string 
    Return StrConv(Coded, vbUnicode) 
End Function 

而且,你的函數是無效的。它將s作爲參數,做一堆東西,然後輸出放入其中的s,而不是在其中處理的東西。

+0

我在問題中看到了錯誤,對此感到抱歉。在發佈之前,我嘗試了許多版本的腳本。無論如何,不​​幸的是,vbUnicode在.net中被刪除,僅用於VB6。所以這不適合我。 – Elarys 2012-08-02 11:49:02

+0

怎麼樣System.Text.Encoding.Convert將字符串轉換爲字節數組? http://msdn.microsoft.com/en-us/library/system.text.encoding.convert(v=vs.71).aspx – Pharap 2012-08-02 11:59:08

+0

我設法使用Heinzi的評論前面找到了一種方法。使用正則表達式和自定義匹配評估器,並結合hextostring函數。一旦我整理了一下,我就會自己發佈代碼,分享它。 – Elarys 2012-08-02 13:00:15