【发布时间】:2016-11-11 21:38:58
【问题描述】:
我正在尝试使用 XMLDocument 来读取 XML 文件。不过,我在编码方面遇到了一些问题。我是这样阅读 XML 文档的:
Dim xmldoc As New XmlDataDocument()
Dim xmlnode As XmlNodeList
Dim i As Integer
Dim fs As New FileStream(tbFileLocation.Text, FileMode.Open, FileAccess.Read)
xmldoc.Load(fs)
xmlnode = xmldoc.GetElementsByTagName("Message")
For i = 0 To xmlnode.Count - 1
Dim SMSToAdd As New SMS()
For Each Child As XmlElement In xmlnode(i).ChildNodes
Dim Name As String = Child.Name.ToString()
If Name = "Body" Then
ContenuDuMessage = Child.InnerText
End If
Next
'Other things
Next
问题是我的 XML 文档包含表情符号。当我读取文件时,将节点(带有表情符号)放入变量中,然后将它们写入另一个文件,一切都按预期工作。不过,如果我使用以下代码:
Dim Temp As Char() = Content.ToCharArray()
Dim Returned As String = ""
For Each Character In Temp
Dim Result As Tuple(Of Boolean, Tuple(Of String, String)) = CharToSurrogates(Character.ToString())
If Result.Item1 Then
Returned &= "&#" & ConvertHexToDec(Result.Item2.Item1) & "; &#" & ConvertHexToDec(Result.Item2.Item2) & ";"
Else
Returned &= Character
End If
Next
Return Returned
内容是一个节点值,因此它可能包含表情符号。这里的目标是将表情符号转换为 XML 实体,以便能够在需要转换表情符号的 Android 应用程序中读取它。 CharToSurrogates 方法基本上只是获取与返回 Tuple(Of Boolean, Tuple(Of String, String)) 描述字符是否为表情符号的字符相关联的代理项,然后关联两个代理项。
虽然,每当我使用我的代码时,表情符号看起来不像表情符号,而是像小方块,因此导致事情永远无法工作:
我该如何解决这个问题?
PS : CharToSurrogates 方法可以在这里找到:http://pastebin.com/LiBB1q2p
【问题讨论】:
-
您确定您的 IDE 可以显示表情符号吗?当字体不包含该字符时,通常会显示该正方形。你检查过字符的实际 UNICODE 值吗?另外,当您可以比较字符时,为什么还要使用
ToString()并比较字符串? -
完全不相关,但我在最近的一个项目中大量使用了 XmlDocument,后来有人建议我应该使用 XDocument(似乎有更多类似 LINQ 的现代功能)。我离兔子洞太远了。至于表情符号,就像@Sami 建议的那样,获取 unicode 值,也许存储和打印可能会更好
-
好吧,我不确定它是否可以显示表情符号......但是,如果我使用两个不同的表情符号并在两者上调用 charToSurrogates 方法,我会得到两倍的返回值,即 (False , ("FFFD", ""))。 ToString 的事情实际上只是为了测试。 unicode 值是什么意思?
-
如果我 debug.print 字符,它也是一样的。如果我使用this 获得 unicode 值,我会得到 D83D,所以它...有点用?但我需要第一个替代品 D83D 和第二个我不知道如何获得的替代品。