【问题标题】:How to find a utf8 code from html document?如何从 html 文档中查找 utf8 代码?
【发布时间】:2018-10-28 23:35:23
【问题描述】:

我目前正在从一个使用图标字体来识别信息的网站上抓取信息。当我找到包含图标的元素时,我得到了预期的“????”字符。我想识别字符的 utf8 代码,因此能够识别使用了哪个符号。

我希望按照以下方式做一些事情:

For Each HTMLElement in HTMLDocument.getElementsbyClassName("icon-class")
  utf8code = HTMLElement.innerText
  If utf8code = U+00AE Then
    'do things
  End If
Next

【问题讨论】:

  • 如果注释掉If 块并在此行设置断点:utf8code = HTMLElement.innerText,会发生什么情况? 调试器应该告诉你正在使用什么值,然后你可以从那里开始编写IfSelect 块。
  • 在调试器中,我能够识别的唯一信息是 innerText 并且再次显示为“未知字符”字形。如果我检查 html 源代码,我还会看到一个未知字符字形。只有当文档在 utf8 中正确编码时才会显示其他任何内容,并且假设您使用的字体在它所引用的地址处具有某些内容。如果我能得到相关字符的代码,但我所看到的一切都试图使用显示文本的默认特征来表示字符。
  • 这个网站按照我的要求做:: soscisurvey.de/tools/view-chars.php :: 当我将字符粘贴到其中时,它会给我代码。我似乎只是在如何在我的程序中做同样的事情上碰壁
  • 您误解了“未知字符”字形的工作原理。原始字符的原始字节仍然存在。您在屏幕上看到的是当前找不到与实际数据匹配的字形时所做的事情,但这并不意味着原始数据发生了变化。您甚至可以将该数据复制/粘贴到您的源代码中。
  • 我明白,问题是我如何从字符串中解码字节数据以有意义的方式解释它。现在我正在使用获取字节将内部文本传递给 utf8encoding 变量。这将创建一个具有四个索引的字节数组。当我检查内部文本的 len 时,我得到两个,尽管它在调试中显示为“????”。第一个猜测是额外的字符可能是一个空字符来终止一个字符串或其他东西。所以我猜我需要弄清楚这 4 个四个索引字节值如何与 utf 代码相关,然后能够从中逆向工程 utf 代码

标签: html vb.net utf-8


【解决方案1】:

好的,虽然我无法完全实现识别任何字符的 utf8 代码的目标,但我设法找到了一种方法来识别我的用例中的字符。

事实证明,在我的例子中,大约有 30 个字符,它们或多或少地按顺序出现在 UTF8 代码页中。然后主题是了解 UTF8 代码是如何形成的,用户 @RemyLebeau 帮助我指出了正确的方向。该视频对此非常有帮助:https://youtu.be/MijmeoH9LT4
我自己的总结如下:
第一个字节:删除前 n+1 位,其中 n = 找到的总字节数
第 2 - 第 n 个字节:删除前两位
结果应该从最右边的位开始向左移动,任何剩下的空间都应该是 8 的倍数,应该用 0 填充。

所以在我的例子中,有 4 个字节:
243、178、129、139
11110011, 10110010, 10000001, 10001011
11110-011, 10-110010, 10 -000001, 10-001011
000(011)(11, 0010)(0000, 01)(001011)
00001111, 00100000, 01001011
F、20、4B

现在是我用来帮助识别我找到的字符的代码:

Dim utf8Encoding As New System.Text.UTF8Encoding(True)
Dim encodedString() As Byte
encodedString = utf8Encoding.GetBytes(HTML_Element.innerText)
Select Case encodedstring(3)
    Case 147
    Case 155
End Select

在我的特殊情况下,我能够使用哈希表将第 4 个字节的值与我需要的单独值相关联。
这是一个好的解决方案吗?不,它只在特定情况下有效,并且能够简单地获取 UTF8 代码将创建一个对所有用例都更有效和优雅的解决方案。但由于这是一个仅供个人使用的项目,并且由于缺乏个人理解和缺乏愿意帮助我理解的人,这个解决方案对我有用,所以我想我会把它包括在内,以防有人发现自己在上述快捷方式可能会有所帮助的类似情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多