2011-11-21 97 views
0

字符集编码会影响strstr()函数的结果吗?编码是否会影响strstr()(和相关函数)的结果

例如,我已读出一个数据为“BUF”和做到这一点:

char *p = strstr (buf, "UNB"); 

不知在ASCII或其他人(例如EBCDIC)的数据是否被编码影响此函数的结果? (由于“UNB”是不同编码方式下的不同位流...)

如果是,那么这些函数使用的默认值是什么? (ASCII?)

谢谢!

+2

如果输入数据的字符编码与您的“原生”编码不匹配,那么上述可能确实不起作用。 –

回答

3

的C函数对原始char数据操作匹配, 独立地编码的。在这种情况下,你可能有两个 不同的编码:一个用于字符串字面, 编译器和填充buf时所用的一个程序。如果这些不是 相同,则该功能可能无法按预期工作。

至于“默认”的编码,没有一个,至少就 为标准而言; ”基本执行字符 集“是实现定义的。实际上,不使用来自ASCII的编码的系统(ISO 8859-1似乎是最常见的,至少在欧洲这里是 )非常罕见。至于编码,你得到 在buf,这取决于角色来自何处;如果你是 从istream阅读,这取决于 流中的语言环境imbue d。然而,实际上,几乎所有这些(UTF-8, ISO8859-x等等)都是从ASCII派生的,并且对于基本执行字符集 (其中的所有字符都与ASCII 相同)其中包括传统C中合法的所有字符)。因此,对于 "UNB",您可能很安全。 (但对于像"üéâ"之类的东西,几乎是 肯定不是。)

+0

嗨James,读到buf的数据直接来自网络伙伴,他们的数据以EBCDIC编码。所以如果我想用buf和“UNB”做strstr,我应该将“UNB”格式的ASCII转换为相应的EBCDIC值字符串“U + B”。它是否正确? – kai

+0

我喜欢在读取数据时转换数据,并在内部坚持使用与ASCII相关的编码。从理论上讲,应该可以在输入流中嵌入EBCDIC语言环境,并让它处理所有事情。实际上,EBCDIC语言环境的实现并不多,尽管定义一个新的“codecvt”方面(进行编码的语言环境的一部分)并不困难,但根据您的阅读方式,其他解决方案可能是简单。 –

-1

使用此功能,数据以ASCII编码。

+0

-1:它在哪里说的? –

0

strstr应该不会对UTF-8编码的Unicode字符的问题。

3

你的字符串常数(“UNB”)进行编码的源文件的编码,所以它必须在缓冲器的编码等strstr

1

这两个字符串参数都必须是相同的编码。用字符串文字编码C++源代码(平台编码)。对于Unicode而言,UTF-8的功能还有另一个问题:Unicode具有重音带有变音符号的字母,但这些也可以编码为基本字母加上组合变音符号。 可以是一个字母[é]或两个:[e] + [combined-']。规范化存在。

对于Java它正在成为远期(一个很沉默的发展)的源编码明确设置为UTF-8。对于C++项目,我不知道这样的约定变得普遍。