【问题标题】:Does encoding affect the result of strstr() (and related functions)编码是否会影响 strstr() (及相关函数)的结果
【发布时间】:2011-11-21 09:08:11
【问题描述】:

字符集编码会影响strstr()函数的结果吗?

例如,我已将数据读取到“buf”并执行此操作:

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

我想知道数据是用 ASCII 编码还是其他编码(例如 EBCDIC)会影响这个函数的结果? (由于“UNB”是不同编码方式下的不同比特流……)

如果是,这些功能使用的默认值是什么? (ASCII?)

谢谢!

【问题讨论】:

  • 如果您输入数据的字符编码与您的“本机”编码不匹配,那么上述方法可能确实不起作用。

标签: c++ c


【解决方案1】:

strstr 等 C 函数对原始 char 数据进行操作, 独立于编码。在这种情况下,您可能有两个 不同的编码:编译器用于字符串文字的一种, 以及您的程序在填写buf 时使用的那个。如果这些不是 相同,则该功能可能无法按预期工作。

关于“默认”编码,至少目前还没有 就标准而言; “基本执行字符” set“是实现定义的。在实践中,系统不 使用从 ASCII 派生的编码(ISO 8859-1 似乎是最常见的,在 欧洲最少)非常罕见。至于你得到的编码 在buf 中,这取决于字符的来源;如果你是 从istream 读取,取决于区域设置imbued 溪流。然而,在实践中,几乎所有这些(UTF-8、 ISO8859-x等)来源于ASCII,与ASCII相同 basic 执行字符集中的所有字符 (包括所有在传统 C 中合法的字符)。因此对于 "UNB",你可能很安全。 (但对于像"üéâ" 这样的东西,你几乎 当然不是。)

【讨论】:

  • 嗨,James,读取到 buf 的数据直接来自网络合作伙伴,他们的数据以 EBCDIC 编码。所以如果我想用 buf 和“UNB”做 strstr,我应该将“UNB”形式的 ASCII 转换成它对应的 EBCDIC 值字符串“U+B”。这是正确的吗?
  • 我倾向于在读取数据时转换数据,并在内部坚持与 ASCII 相关的编码。理论上,应该可以在输入流中加入 EBCDIC 语言环境,并让它处理所有事情。实际上,EBCDIC 语言环境的实现并不多,虽然定义一个新的codecvt facet(进行编码的语言环境部分)并不难,但取决于您的阅读方式,其他解决方案可能是更简单。
【解决方案2】:

您的字符串常量(“UNB”)以源文件编码进行编码,因此它必须与您的缓冲区的编码相匹配

【讨论】:

    【解决方案3】:

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

    对于 Java,将源编码显式设置为 UTF-8 已成为一种习惯(一种非常无声的开发)。对于 C++ 项目,我不知道这样的约定会变得很普遍。

    【讨论】:

      【解决方案4】:

      strstr 对 UTF-8 编码的 unicode 字符应该没有问题。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2012-08-11
          • 2016-03-09
          • 1970-01-01
          • 2013-06-03
          • 1970-01-01
          • 2023-02-07
          • 1970-01-01
          • 2021-02-20
          • 2016-11-11
          相关资源
          最近更新 更多