isspace()可以对UTF-8文本给出假阳性吗?

Can isspace() give false positives with UTF-8 text?

本文关键字:文本 UTF-8 isspace      更新时间:2023-10-16

我知道isspace()是为ASCII工作的,但我有UTF-8文本。如果isspace()只查看UTF-8和ASCII重叠的低7位,则使用它应该是安全的。

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

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

isspace()受运行时空白字符的区域设置定义的约束。

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

在c++中,空白字符由指定的区域设置定义:

  1. 当使用<cctype>报头的std::isspace()版本时,对std::setlocale(LC_ALL)std::setlocale(LC_CTYPE)的调用

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

使用的默认区域设置是"C"区域设置,它定义了以下空白字符,它们在UTF-8和ASCII中是相同的,并且大多数区域设置与ASCII兼容,但在其他区域设置中可能不同: <>之前(0x20)空间(SPC)'t' (0x09)水平制表符(tab)'n' (0x0a)换行符(LF)'v' (0x0b)垂直标签(VT)'f' (0x0c)馈入(FF)'r' (0x0d)回车(CR)

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