【问题标题】:XML reading and encoding problemsXML读取和编码问题
【发布时间】: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 和第二个我不知道如何获得的替代品。

标签: .net xml vb.net


【解决方案1】:

IDE 不能(至少我的不能)在调试器中显示表情符号。我写了这个测试来看看它保存后的样子。

    Dim someXML As XElement

    someXML = <root>
                  <emoji></emoji>
              </root>
    '
    Dim emoji As String = "?"
    someXML.<emoji>.Value = emoji
    someXML.Save("C:\Users\xxxxxxxx\Desktop\emoji.xml")

当我查看文件(双击文件名)时,表情符号正确显示。

我从这里使用了“浏览器”列中列出的项目,http://unicode.org/emoji/charts/emoji-list.html,它们似乎有效,至少我尝试过的那些。

    Dim emoji As String = "???????"

【讨论】:

    猜你喜欢
    • 2014-09-12
    • 2014-04-18
    • 2014-01-05
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 2015-07-27
    • 2012-01-12
    • 1970-01-01
    相关资源
    最近更新 更多