2017-11-08 3 views
0

Ich brauche die Verarbeitung einer Zeichenfolge zu testen, die valid non-ascii characters + invalid non-ascii characters + invalid ascii characters enthält.Gültig/ungültig Nicht-ASCII und ungültigen ASCII-Zeichen

Kann mir jemand bitte ein paar Beispiele für solche Zeichen geben. Es wäre großartig, wenn Sie mir die Bandbreite ihres Wertes in ihrer Kategorie mitteilen könnten, da ich nicht ganz in der Lage bin zu unterscheiden, welche Nicht-Ascii-Werte gültig und welche ungültig sein könnten.

Ex : String str = "Bj��rk����oacute�"; 
        ^
         Is it a valid or invalid non-ascii 

FYI Ich bin ein Anfänger in Java.

+0

Sie einige Beispiele für jeden (gültigen Nicht-ascii, ungültig Nicht-ascii, ungültig ascii) zur Verfügung stellen können? –

+0

Ich habe das nicht abgelehnt, aber es ist wahrscheinlich, weil Sie keine Beispiele von dem, was Sie suchen, sowie keine Form des Versuchs zeigen. –

+0

Es gibt die Klasse Character in Java, die über mehrere Methoden verfügt, die das bestimmen können. Sagen Sie zum Beispiel, ob es ein Leerzeichen oder ein Steuerzeichen ist. Hängt davon ab, was für Sie "nicht-ascii" ist? –

Antwort

0

Es gibt 128 gültige grundlegende ASCII-Zeichen, die den Werten 0 (NUL Byte) bis 127 (DEL Zeichen) zugeordnet sind. See here.

Das Wort ‚Charakter‘ muss mit Bedacht verwendet werden. Die Definition von "Charakter" ist eine besondere. Zum Beispiel die è, ist das ein Zeichen? Oder sind es zwei Zeichen (e und `)? Es kommt darauf an.

Zweitens ist eine Folge von Zeichen von seiner Codierung völlig unabhängig. Der Einfachheit halber nehme ich an, dass jedes Byte als ein Zeichen interpretiert wird.

Sie können bestimmen, ob ein Byte kann als ASCII-Zeichen analysiert werden, können Sie einfach tun:

byte[] bytes = "Bj��rk����oacute�".getBytes(); 
for (byte b : bytes) { 
    // What's happening here? A byte that is in the range from 0 to 127 is 
    // valid, and other values are invalid. A byte in Java is signed, that 
    // means that valid ranges are from -128 to 127. 
    if (b >= 0) { 
     System.out.println("Valid ASCII"); 
    } 
    else { 
     System.out.println("Invalid ASCII"); 
    } 
} 
1

Einiger Hintergrund

Als Java erfunden wurde, ein sehr wichtiges Design Entscheidung war, dass Text in Java Unicode wäre: ein Nummerierungssystem aller Grapheme in der Welt. Daher char ist zwei Bytes (in UTF-16, einer der Unicode "universellen Zeichensatz Transformation Format"). Und byte ist ein eindeutiger Typ für Binärdaten.

Unicode nummeriert alle Symbole, sogenannte Codestellen, wie , wie U + 266B. Diese Zahlen erreichen die drei Byte langen Ganzzahlen. Daher werden Codepunkte in Java als int dargestellt.

ASCII ist ein 7-Bit-Teilmenge von Unicode UTF-8, 0 - 127.

UTF-8 ist ein Multibyte Unicode-Format, in dem ASCII eine gültige Teilmenge ist, und eine höhere Symbole

Gültigkeit

Sie wurden gebeten, "ungültig" Zeichen zu identifizieren falsch = produziert Codepunkte. Sie könnten identifizieren auch Codeteile die ungültige Zeichen erzeugen. (Einfacher.)

In der obigen ist ein Platzhalterzeichen (wie ?), die einen Code-Punkt ersetzt, der nicht in dem aktuellen Zeichensatz darstellbar ist. Wenn der Code einen ? als Platzhalter erzeugte, kann man nicht erraten, ob eine Substitution stattgefunden hat. Für einige westeuropäische Sprachen hat die Verschlüsselung Windows-1252 (Cp1252, MS Windows Latin-1).Sie können überprüfen, ob ein Codepunkt aus einem String in den Charset konvertiert werden kann.

Dann bleiben falsch positive, falsche Zeichen, die jedoch in Cp1252 existieren. Das könnte eine Multi-Byte-Codefolge von UTF-8 sein, die als mehrere Window-1252-Zeichen interpretiert wird. Also: ein akzeptables Nicht-ASCII-Zeichen neben einem inakzeptablen Nicht-ASCII-Zeichen ist ebenfalls zu vermuten. Das bedeutet, dass Sie die Sonderzeichen in Ihrer Sprache und Extras auflisten müssen: wie spezielle Anführungszeichen, in Englisch leihen sich wie ç, ñ.

Für MS-Windows Latin-1 (ein verändertes ISO Latin-1) so etwas wie:

boolean isSuspect(char ch) { 
    if (ch < 32) { 
     return "\f\n\r\t".indexOf(ch) != -1; 
    } else if (ch >= 127) { 
     return false; 
    } else { 
     return suspects.get((int) ch); // Better use a positive list. 
    } 
} 

static BitSet suspects = new BitSet(256); 
static { 
    ... 
}