在宽数据上使用窄字符串操作函数

时间:2011-06-02 18:03:11

标签: c utf-8 internationalization widestring

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

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

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

然而,这些当然都假设并且要求字符串以NULL结尾。 因此,我的问题是 - 如果您将宽数据表示为char *,那么数据中是否可以出现NULL终结符而不是结尾?

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

C区分多字节字符宽字符

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

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

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

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