gpt4 book ai didi

html-entities - 使用 libxml 保留 HTML 实体

转载 作者:行者123 更新时间:2023-12-04 05:50:55 25 4
gpt4 key购买 nike

我正在编写一个方法来解析 HTML 字符串,查询并获取一些节点,然后输出这些节点的 HTML。

我正在使用 libxml ,并设法加载和解析输入 HTML,并为我想要的节点输出 HTML 字符串,除了我想要保留任何 HTML 实体,并且 libxml 似乎将这些转换为它们关联的 UTF-8 字符。

这是我到目前为止所得到的(代码是 Objective-C 项目的一部分):

NSString *HTMLString = ...
NSData *documentData = [HTMLString dataUsingEncoding:NSUTF8StringEncoding];

//Create the document
xmlDocPtr doc = htmlReadMemory([documentData bytes],
[documentData length],
"",
NULL,
HTML_PARSE_NOWARNING | HTML_PARSE_NOERROR);

//Get the node I want to output
xmlNodePtr node = ...

//Create the node buffer and fill it with the node content
xmlBufferPtr nodeBuffer = xmlBufferCreate();
htmlNodeDump(nodeBuffer, doc, node);

...

这会很好地转储节点的 HTML 内容,除了字符实体被转换为 UTF-8 字符——输入 HTML 中唯一存在的实体是引号,如 ’‘ ,我想在写出节点的 HTML 内容时保留它。

我浏览了与 HTML 解析和 HTML 树函数相关的 libxml 文档,但似乎找不到任何关于 HTML 实体的信息。我也不确定这是否是在解析或输出期间完成的。我确实尝试使用 xmlNodeGetContent() 简单地输出节点的内容并且实体也被相应的 UTF8 字符替换,这让我怀疑这是解析问题,但我不确定。

最佳答案

事实证明,问题在于 libxml 在内部使用 UTF-8(在 xmlsoft 上的 Encodings Support 中解释),它将所有 HTML 字符实体转换为 UTF-8 字符,因此在输出 HTML 时会将这些作为转换后的 UTF- 8 个字符。

该解决方案也在 xmlsoft 的编码部分中,在“默认支持的编码”下:

libxml2 has a set of default converters for the following encodings (located in encoding.c):

  1. UTF-8 is supported by default (null handlers)
  2. UTF-16, both little and big endian
  3. ISO-Latin-1 (ISO-8859-1) covering most western languages
  4. ASCII, useful mostly for saving
  5. HTML, a specific handler for the conversion of UTF-8 to ASCII with HTML predefined entities like © for the Copyright sign.


它还建议使用诸如 UTF8Toisolat1 之类的转换函数。 ' 将从 libxml 函数返回的值转换为另一种编码。

解决方案是使用 UTF8ToHtml() 转换 HTML 输出。函数将用相关的 HTML 实体(例如 &rsquo;&lsquo; )替换非 ASCII 字符。这似乎离开了 HTML 标签 <>字符未受影响,这与我尝试使用 htmlEncodeEntities() 时不同,将它们替换为 &lt;&gt; .

我在使用 UTF8ToHtml() 时没有解决的一件事是如何确定为输出缓冲区分配多少内存,因为用实体替换单个字符会增加 HTML 字符串的长度,因此您不能只使用输入 HTML 的长度。我只是分配了两倍大小的输入缓冲区(我认为这应该足以满足我的所有用例),然后使用实际使用的长度(通过 UTF8ToHtml() 中的指针参数返回),但我不确定有更好的方法来做到这一点。

关于html-entities - 使用 libxml 保留 HTML 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10062780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com