为什么弃用isascii()?

Mat*_*nte 10 c c++ ascii posix libc

根据isascii()手册页:

http://linux.die.net/man/3/isascii

POSIX.1-2008将isascii()标记为已过时,并指出它无法在本地化应用程序中进行移植.

我不确定我看到可移植性问题在哪里.这个函数的一个非常简单的实现是:

int isascii(int ch) { return ch >= 0 && ch < 128; }
Run Code Online (Sandbox Code Playgroud)

在哪种情况下上述实现不充分或不可移植?

谢谢

Thi*_*ilo 7

我认为如果您的字符编码不专门用于 ASCII 的低七位范围,那么它就不起作用。当给定的字节只是字符的一部分时,可能会发生在某些多字节编码中。

例如,在Shift-JIS中,第二个字节可以从 0x40 开始,这与 ASCII 重叠。即使在第一个字节中,也有一些细微的变化,例如 0x5C(货币符号而不是反斜杠)或 0x7E(某种斜杠而不是波形符)。

我发现这篇文章,其中有人解释了他们自己的操作系统设计中不包含 POSIX 函数的原因:

这个功能其实没什么意义。如果我们使用与 ascii 不兼容的字符编码,那么它就没有意义。如果我们使用正常的字符编码(例如 UTF-8),那么您可以简单地检查该值是否最多为 127。