为什么 isascii() 被弃用?

问题描述 投票:0回答:3

根据 isascii() 联机帮助页:

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

POSIX.1-2008 将 isascii() 标记为过时,并指出它不能 在本地化应用程序中可移植地使用。

我不确定我是否明白可移植性问题出在哪里。该功能的一个非常简单的实现是:

int isascii(int ch) { return ch >= 0 && ch < 128; }

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

谢谢你

c++ c ascii posix libc
3个回答
5
投票

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

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

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

这个功能没什么意义。如果我们使用的字符编码不是 ascii 兼容,那就没有意义了。如果我们使用一个理智的角色 编码如UTF-8,那么你可以简单地检查该值是否最多为127。


0
投票

会议记录有这样的内容:

isacii:标记为过时。应用程序使用应注意,这不能在本地化应用程序中移植使用。


0
投票

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

当使用任何 EBCDIC 字符集时。

在 EBCDIC 代码页中,非 ASCII 字符的值介于 0 到 127 之间,例如 SPS 字符在 EBCDIC 中具有值

0x09
,但不是 ASCII 字符(它对应于 U+0085 Unicode 代码) UTF-8 中编码为 0xC2 0x85 的点,超出了 ASCII 范围)。

EBCDIC 中还有一些值大于

127
的 ASCII 字符,例如 所有字母数字字符! 请参阅 https://en.wikipedia.org/wiki/EBCDIC#Code_page_layout,其中显示了所有a-z、A-Z 和 0-9 都在 127 以上。EBCDIC 始终是 8 位编码,因此基本的 alnum 字符不需要位于低 7 位。

因此,对于使用 EBCDIC 的系统,您的实现会将

isascii('\u0085')
指定为
true
,并将
isascii('a')
指定为
false

© www.soinside.com 2019 - 2024. All rights reserved.