2011-06-02 40 views
1

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

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

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

但是,这些当然都假设和要求的字符串是NULL终止。 因此,我的问题是 - 如果您将宽数据表示为char *,那么可以在数据内部而不是在数据末尾出现NULL终止符?

即,如果某个特定语言的字符不需要2个字节来表示它,并且它在一个字节中表示,那么其他字节是否可以为NULL?

回答

3

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

+0

因此,如果解析器返回UTF8我可以在UTF-8数据上作为char *操作,然后在显示字符串之前调用UTF8toUTF16转换函数? (gui元素使用uint16 *(无符号短符号)参数)。 – Gruntcakes 2011-06-02 18:31:34

+0

是的,但是当用UTF-8编码时,您不会知道字符串中有多少个字符。 – cababunga 2011-06-02 18:42:34

+0

UTF-8是1到4个字节,由于Unicode代码点的范围不需要,所以5和6字节编码已被删除。 – 2011-06-02 18:55:48

0

Ç多字节字符和宽字符之间区分:

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

  • 多字节字符可能需要不同数量的字节来表示。多字节编码的例子是UTF-8和UTF-16。

当使用UTF-8,您可以继续使用str*功能,但你必须记住,他们不提供一种方式来返回字符的字符串的长度,你需要转换为宽字符,并使用wcslenstrlen返回字节的长度,而不是字符,这在不同情况下很有用。

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

+0

从XML解析器输出的内容将类似于“text1 {.text2} {text3}”。我需要形成像“text1 somethingelse text3”这样的字符串。所以需要解析'{','}'和'。'并随着时间的推移建立一个新的字符串。如果我处理的内容不是'{','}','。'作为与字符相反的字节流,我假设我可以使用strcpy,strcat等函数来生成结果,然后将结果转换为utf16。 – Gruntcakes 2011-06-02 20:58:56

+0

是的,正如我所说的,'str *'函数大部分工作在UTF-8中,使用相同的语义,除了'strlen()',由于'char' ='byte','multibyte char'≠'字节/ char'。 – ninjalj 2011-06-02 21:02:45