Почему isascii() устарел?

В соответствии с isascii() manpage:

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

POSIX.1-2008 отмечает isascii() как устаревший, отмечая, что он не может быть используется портативно в локализованном приложении.

Я не уверен, что вижу, где проблема переносимости. Очень простая реализация этой функции:

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

В каких ситуациях вышеуказанная реализация не является достаточной или не переносимой?

Спасибо

Ответ 1

Я полагаю, что это не сработает, если у вас есть кодировка символов, которая не использует низкий семибитовый диапазон исключительно для ASCII. Вероятно, происходит в некоторых многобайтовых кодировках, когда данный байт является только частью символа.

Например, в Shift-JIS второй байт может начинаться с 0x40, который перекрывается с ASCII. И даже в первом байте есть некоторые небольшие изменения, такие как 0x5C (символ валюты вместо обратного слэша) или 0x7E (какая-то косая черта вместо тильды).

Я нашел эту статью где кто-то объяснил причину невключения функций POSIX в свой собственный дизайн ОС:

Эта функция довольно бессмысленна. Если мы используем кодировку символов, которая не была    ascii совместим, тогда это не имеет смысла. Если мы используем здравый характер    кодирования, такого как UTF-8, тогда вы можете просто проверить, не превышает ли значение 127.

Ответ 2

протоколы заседаний говорят об этом:

isascii: отметьте устаревшим. Применение приложения должно учитывать, что это нельзя использовать портативно в локализованном приложении.