2014-09-25 7 views
10

Gemäß dem isascii() -Manpage:Warum ist isascii() veraltet?

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

POSIX.1-2008 Markierungen isascii() als überholt, unter Hinweis darauf, dass es nicht in einer lokalisierten portably Anwendung verwendet werden kann.

Ich bin mir nicht sicher, ich sehe, wo das Problem der Portabilität ist. Eine sehr einfache Implementierung dieser Funktion ist:

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

In welchen Situationen ist die obige Implementierung entweder nicht ausreichend oder nicht tragbar?

Danke

+0

@SaiyamDoshi: macht das etwas anderes? – Thilo

+1

Ob diese Implementierung ausreichend und portabel ist, hängt davon ab, wofür Sie diese Funktion verwenden möchten. Woran denkst du? – hvd

+4

Die Funktion ist definitiv nicht portierbar für Systeme, die keine ASCII-Codierung für Zeichen verwenden, wie IBM Mainframes. –

Antwort

3

Ich nehme es nicht, wenn Sie eine Zeichenkodierung haben würde funktionieren, die nicht die niedrigen sieben-Bit-Bereich ausschließlich für ASCII nicht verwendet. Wahrscheinlich geschieht dies in einigen Multibyte-Kodierungen, wenn das angegebene Byte nur ein Teil des Zeichens ist.

Zum Beispiel kann in Shift-JIS das zweite Byte bei 0x40 beginnen, was sich mit ASCII überschneidet. Und selbst im ersten Byte gibt es einige geringfügige Änderungen, wie 0x5C (Währungssymbol anstelle von Backslash) oder 0x7E (irgendeine Art von Schrägstrich anstelle von Tilde).

Ich fand diese article, wo jemand, den Grund für die Nichtaufnahme von POSIX-Funktionen in ihrem eigenen OS Design erklärt:

Diese Funktion ist ziemlich sinnlos. Wenn wir eine Zeichencodierung verwenden, die nicht kompatibel mit war, dann ergibt das keinen Sinn. Wenn wir einen vernünftigen Charakter Codierung wie UTF-8 verwenden, dann können Sie einfach überprüfen, ob der Wert höchstens 127.

+0

Ich denke, er fragt nach einer spezifischen Codierung, in der es wahr wäre, und ich kann mir keine vorstellen. Die Codierungen, die ich kenne, überlappen die ersten 128 Werte. – thang

0

Die meeting minutes haben folgendes zu sagen:

isascii: mark veraltet . Die Anwendungsverwendung sollte beachten, dass dies in einer lokalisierten Anwendung nicht portabel verwendet werden kann.

+0

Was sagt uns eigentlich nichts, oder? Er fragt * warum * es kann nicht portabel in einer lokalisierten Anwendung verwendet werden. –

+1

Es ist immer noch gut, wenn jemand die ursprüngliche Quelle der Entscheidung zitiert. Dies könnte das Beste sein, was wir von posix als der ursprünglichen Argumentation erhalten können. –