我在VB.net中有一个字符串,可能包含以下内容:
这是一个0x000020AC符号
根据本文http://www.fileformat.info/info/unicode/char/20ac/index.htm
,这是欧元符号的UTF-32编码我想把它转换成
这是一个€符号
我尝试在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
这是基于http://msdn.microsoft.com/en-us/library/system.text.unicodeencoding.aspx
上MSDN上的示例可能是因为我完全误解了它在VB.net中是如何工作的。在C#中,我可以简单地使用转义字符,例如“\ u20AC”。但VB.net中没有这样的东西。
答案 0 :(得分: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
答案 1 :(得分:0)
你试过了吗?
Public Function Decode(Byval Coded as string) as string
Return StrConv(Coded, vbUnicode)
End Function
此外,您的功能无效。它需要s作为参数,做一堆东西,然后输出放入其中的s而不是在其中处理的东西。