1

我正在解析一个 XML 文件,它可以包含不同语言的本地化字符串(目前它只是英语和西班牙语,但将来它可能是任何语言),XML 解析器的 API 通过返回 XML 中的所有数据char* 是 UTF8 编码的。

解析后需要对数据进行一些操作(在其中搜索子字符串、连接字符串、确定子字符串的长度等)。

使用 strlen、strcat 等标准函数会很方便。由于我从 XML 解析器接收的原始数据是 char*,因此我可以使用这些标准字符串处理函数轻松完成所有操作。

然而,这些当然都假设和要求字符串是 NULL 终止的。因此,我的问题是 - 如果您有表示为 char* 的宽数据,NULL 终止符是否会出现在数据中而不是末尾?

即,如果某种语言中的字符不需要 2 个字节来表示它,并且它用一个字节表示,那么另一个字节是否会/可以为 NULL?

4

2 回答 2

3

UTF-8 不是“宽”的。UTF-8 是多字节编码,其中 Unicode 字符可以占用 1 到 4 个字节。UTF-8 在有效字符内不会有零终止符。确保您对解析器提供给您的内容不感到困惑。它可能是 UTF-16 或 UCS2 或它们的 4 字节等价物放在宽字符串中,在这种情况下,您必须将它们视为宽字符串。

于 2011-06-02T18:12:51.810 回答
0

C 区分多字节字符宽字符

  • 宽字符必须能够使用完全相同的字节数来表示执行字符集中的任何字符(例如,如果 兀 需要 4 个字节来表示,A 也必须用 4 个字节来表示)。宽字符编码的示例是 UCS-4 和已弃用的 UCS-2。

  • 多字节字符可以采用不同数量的字节来表示。多字节编码的示例是 UTF-8 和 UTF-16。

使用 UTF-8 时,您可以继续使用这些str*函数,但您必须记住,它们不提供返回字符串字符长度的方法,您需要转换为宽字符,并使用wcslen. strlen返回以bytes为单位的长度,而不是characters,这在不同情况下很有用。

我不能过分强调执行字符集的所有元素都需要表示为以字节为单位预定义大小的单个宽字符。一些系统的宽字符使用UTF-16,结果是实现不符合C标准,一些wc*功能可能无法正常工作。

于 2011-06-02T19:21:02.917 回答