这个问题与that one非常相似,但我需要在C中做同样的事情,而不是python。以下是函数应该执行的一些示例:
input output
< <
> >
ä ä
ß ß
该函数应具有签名char * html2str(char * html)或类似名称。我不是从流中逐字节读取的。
我可以使用库函数吗?
答案 0 :(得分:2)
没有标准的库函数来完成这项工作。开源世界必须有大量的实现 - 几乎任何必须处理HTML的程序都会有一个。
问题有两个方面:
因为最短的实体是'&amp; x;' (但是,AFAIK,它们在&符号和分号之间至少使用2个字符),因为最长的UTF-8字符表示是4个字节,所以你总是缩短字符串。因此,可以安全地原位编辑。
Kernighan和Pike在'The Practice of Programming'中有一个HTML实体解码的例子,尽管它在某种程度上已经过时了。他们使用标记器来识别实体,并使用实体名称的排序表加上替换值,以便他们可以使用二进制搜索来识别替换。这仅适用于非算法实体名称。对于编码为“ß”的实体,您使用算法技术对其进行解码。
答案 1 :(得分:0)
这听起来像是flex
的工作。当然,flex通常是基于流的,但您可以使用flex函数yy_scan_string
(或其亲属)来更改它。有关详细信息,请参阅The flex Manual: Scanning Strings。
Flex的基本Unicode支持非常糟糕,但是如果你不介意手工编写字节,那么它可能是一种解决方法。可能还有其他工具可以做你想做的事。