4 Stimmen

C++ erweiterte ASCII-Zeichen

Wie man das Vorhandensein von erweiterten ASCII-Werten (128 bis 255) in einem C++-Zeichenarray erkennt.

20voto

Joachim Sauer Punkte 290477

Bitte denken Sie daran, dass es keine erweiterte ASCII gibt. ASCII wurde und wird nur zwischen 0 und 127 definiert. Alles darüber ist entweder ungültig oder muss in einer anderen als ASCII definierten Codierung vorliegen (zum Beispiel ISO-8859-1).

Bitte lesen Sie Das absolute Minimum, das jeder Softwareentwickler absolute kennen muss über Unicode und Zeichencodierungen (Keine Ausreden!).

Ansonsten: Was spricht dagegen, darüber zu iterieren und auf Werte > 127 (oder <0 bei Verwendung von vorzeichenbehafteten chars) zu überprüfen?

4 Stimmen

@shoosh: Lies deinen Link noch einmal: "Die Verwendung des Begriffs wird manchmal kritisiert, weil er fälschlicherweise interpretiert werden kann, dass der ASCII-Standard aktualisiert wurde, um mehr als 128 Zeichen zu enthalten oder dass der Begriff eindeutig eine einzelne Kodierung identifiziert, was beides nicht zutrifft"

2 Stimmen

@shoosh: Mir ist bekannt, dass einige Kodierungen kollektiv als "erweitertes ASCII" bezeichnet werden können, aber immer wenn ich jemanden diesen Begriff verwenden sehe, wissen sie normalerweise nicht, was das bedeutet. Deshalb rate ich von seiner Verwendung ab und versuche zu klären, wo ich es verwendet sehe.

0 Stimmen

@MSalters das ist die lameste Ausrede für -1. @shoosh erweiterte ascii ist nicht standardmäßig.

8voto

MSalters Punkte 166675

Char kann signiert oder unsigniert sein. Dies ist jedoch nicht wirklich wichtig. Sie möchten tatsächlich überprüfen, ob jeder Zeichen für ASCII gültig ist. Dies ist eine positive, eindeutige Überprüfung. Sie überprüfen einfach, ob jedes Zeichen sowohl >=0 als auch <= 127 ist. Alles andere (ob positiv oder negativ, "Extended ASCII" oder UTF-8) ist ungültig.

3voto

EvilTeach Punkte 27313

Benutzt niemand isascii noch?

char c = (char) 200;

if (isascii(c))
{
    cout << "es ist ascii!" << endl;
}
else
{
    cout << "es ist nicht ascii!" << endl;
}

2voto

Lee B Punkte 2107

Stellen Sie sicher, dass Sie das Byte-Reihenfolge der Maschine kennen, überprüfen Sie einfach das höchste Bit mit einer bitweisen UND-Maske:

if (ch & 128) {
  // höchstes Bit ist gesetzt
} else {
  // sieht aus wie ein 7-Bit-Wert
}

Aber es gibt wahrscheinlich Lokalisierungsfunktionen, die Sie für dies verwenden sollten. Noch besser ist es, WISSEN, mit welcher Zeichenkodierung die Daten hereinkommen. Versuchen, es zu erraten, ist wie zu versuchen, das Format der Daten zu erraten, die in Ihre Datenbankfelder gehen. Es mag hineingehen, aber Müll rein bedeutet Müll raus.

0 Stimmen

Hallo Lee B. Meine Anwendung fungiert als Middleware zwischen der Java-Front-End- und der DCE-Backend-Anwendung. Der DCE-Server fügt einige Müllzeichen in das Outparam der Middleware ein. Ich muss den Inhalt des Outparams an das Front-End senden. Beim Senden des Müllzeichens stürzt die Middleware ab.

0 Stimmen

Ich muss das char* von DCE in einen String konvertieren und dann an die Front-End weitergeben.

0 Stimmen

Du solltest 128 besser in char umwandeln, da sonst ch in int umgewandelt wird, wodurch 128 nicht mehr das High-Bit ist.

1voto

Alex Reitbort Punkte 13255

Iteriere über das Array und überprüfe, dass jeder Zeichen nicht im Bereich von 128 bis 255 liegt?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X