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)
在哪种情况下上述实现不充分或不可移植?
谢谢
我认为如果您的字符编码不专门用于 ASCII 的低七位范围,那么它就不起作用。当给定的字节只是字符的一部分时,可能会发生在某些多字节编码中。
例如,在Shift-JIS中,第二个字节可以从 0x40 开始,这与 ASCII 重叠。即使在第一个字节中,也有一些细微的变化,例如 0x5C(货币符号而不是反斜杠)或 0x7E(某种斜杠而不是波形符)。
我发现这篇文章,其中有人解释了他们自己的操作系统设计中不包含 POSIX 函数的原因:
这个功能其实没什么意义。如果我们使用与 ascii 不兼容的字符编码,那么它就没有意义。如果我们使用正常的字符编码(例如 UTF-8),那么您可以简单地检查该值是否最多为 127。