【问题标题】:Can isspace() give false positives with UTF-8 text?isspace() 可以用 UTF-8 文本给出误报吗?
【发布时间】:2016-06-25 12:05:25
【问题描述】:

我知道isspace() 适用于 ASCII,但我有 UTF-8 文本。如果isspace() 只查看低 7 位,也就是 UTF-8 和 ASCII 重叠的地方,那么它应该可以安全使用。

安全使用是指它不会将非空格的 Unicode 字符检测为空格。我知道它可能无法检测到特殊的 Unicode 空白,但这对我来说不是问题。

即我可以接受假阴性,只要没有阳性。假设是正确的吗?

【问题讨论】:

  • is space 适用于任何固定宽度的单字节字符集,其中 ASCII 是最常见的,但绝不是唯一的例子。在使用非 ASCII 字符集的系统上,它会为该字符集而不是 ASCII 给出适当的答案。
  • @PeteBecker 有现代的非 ASCII 系统吗?我听说过 EBCDIC,但据我所知,这些都是从很久以前开始的,当时事情还没有标准化。
  • 错误的问题。如果您基于全世界都是 ASCII 的观点做出设计和编码决策,那么您最好能够证明它是正确的。其他任何东西都不是工程。
  • @PeteBecker 好的,我会记住这一点。我需要的代码只能在 Linux 上运行(在 x86 PC 上),所以至少出于我的目的,我确信它会是 ASCII。
  • 这是一个无意义的论点,UTF-8 只意味着一件事,它与任何传统的 8 位编码都有关系。它是一种 Unicode 编码,旨在消除歧义。如果您根本不关心排版的准确性,那么根本不要打扰并使用== ' '。它永远不会匹配 utf-8 序列的一部分,第二个和后续字节的 MSB 打开。

标签: c++ utf-8 isspace


【解决方案1】:

isspace() 在运行时受制于空白字符的语言环境定义。

在 C 中,空白字符由调用 setlocale(LC_ALL)setlocale(LC_CTYPE) 时指定的语言环境定义。

在 C++ 中,空白字符由以下任一指定的语言环境定义:

  1. 在使用来自<cctype> 标头的std::isspace() 版本时调用std::setlocale(LC_ALL)std::setlocale(LC_CTYPE)

  2. 输入 locale 参数,当使用来自 <locale> 标头的 std::isspace() 版本时。

使用的默认语言环境是"C"语言环境,它定义了以下空白字符,它们在UTF-8和ASCII中是相同的,大多数语言环境是与 ASCII 兼容,但在其他语言环境中可能会有所不同:

' ' (0x20) 空间 (SPC) '\t' (0x09) 水平制表符 (TAB) '\n' (0x0a) 换行符 (LF) '\v' (0x0b) 垂直制表符 (VT) '\f' (0x0c) 馈送 (FF) '\r' (0x0d) 回车 (CR)

【讨论】:

    【解决方案2】:

    这可能是安全的,因为对于 0127 之间的代码点,ASCIIutf-8 之间绝对没有区别。

    【讨论】:

    • 例如,EBCDIC 和 utf-8 之间存在很大差异,而在使用 EBCDIC 作为其本机编码的系统上,isspace 不会给出对 ASCII 或 utf 有意义的答案-8.
    • 但是 isspace() 会检查 127 以上的内容吗?那是我不确定的部分。
    • 检查this。它为除U+FEFF 之外的所有对象返回True
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    相关资源
    最近更新 更多