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 {
...
}
Sie einige Beispiele für jeden (gültigen Nicht-ascii, ungültig Nicht-ascii, ungültig ascii) zur Verfügung stellen können? –
Ich habe das nicht abgelehnt, aber es ist wahrscheinlich, weil Sie keine Beispiele von dem, was Sie suchen, sowie keine Form des Versuchs zeigen. –
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? –