我正在使用 TinyXML 来解析/构建XML文件。现在,根据文档,该库通过UTF-8支持多字节字符集。到目前为止,我认为这么好。但是,库提供的唯一API(用于获取/设置元素名称,属性名称和值,...使用字符串的所有内容)是通过std::stringconst char*。这让我怀疑自己对多字节字符集支持的理解。如何只支持8位字符的字符串包含16位字符(除非它使用代码页,这将否定'支持Unicode'声明)?我理解你理论上可以采用16位代码点并将其分成2个字符在<=>中,但是这不会将<=>转换为'Unicode'字符串,它会使它在大多数情况下无效并且在写入文件并被其他程序读入时可能会意外工作。

那么,有人可以向我解释一个库如何提供'8位接口'(<=>或<=>)并仍然支持'Unicode'字符串吗?

(我可能在这里混淆了一些Unicode术语;对不起有任何混淆)。

有帮助吗?

解决方案

首先,utf-8存储在const char *字符串中,正如@quinmars所说。它不仅是7位ASCII的超集(代码点<!> lt; = 127总是在单个字节中编码为自身),还要小心的是,带有这些值的字节永远不会被用作多字节编码的一部分代码点的值<!> gt; = 128.所以,如果你看到一个字节== 44,那就是'<!> lt;' XML中的所有metachars都是7位ASCII。因此,人们可以解析XML,打破metachars所说的字符串,将片段(可能包括非ASCII字符)粘贴到char *或std :: string中,并且返回的片段仍然是有效的UTF-8字符串,即使解析器并不特别知道UTF-8。

进一步(不是特定于XML,而是非常聪明),甚至更复杂的事情也只是工作(tm)。例如,如果按字节顺序按字典顺序对UTF-8进行排序,则会得到相同的答案,即按字典顺序对代码点进行排序,尽管使用的字节数有所不同,因为前缀字节引入了较长(因此值较高)的代码点数在数值上大于较小值的点。)

其他提示

UTF-8与7位ASCII码兼容。如果一个字节的值大于127,则表示多字节字符开始。根据第一个字节的值,您可以看到该字符将占用多少字节,可以是2-4个字节,包括第一个字节(技术上也可以是5或6,但它们不是有效的utf-8)。以下是关于UTF-8的一个很好的资源: UTF-8和Unicode FAQ ,utf8的维基页面也非常有用。由于UTF-8是基于字符和0终止的,因此您可以在大多数情况下使用标准字符串函数。唯一重要的是字符数可能与字节数不同。像strlen()这样的函数返回字节数,但不一定是字符数。

使用1到4个字符编码一个Unicode代码点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top