2016-03-30 11 views
3

Ein Benutzer kann kopieren und in eine Textarea-HTML-Eingabe einfügen und fügt manchmal ungültige UTF-8-Zeichen ein, zum Beispiel Kopieren und Einfügen aus einer RTF-Datei, die Registerkarten enthält.Überprüfen, ob JavaScript-Zeichenfolge gültig ist UTF-8

Wie kann ich überprüfen, ob eine Zeichenfolge eine gültige UTF-8 ist?

+1

kann Hilfe http://stackoverflow.com/questions/20639052/check -if-the-bytes-sequenz-is-valid-utf-8-sequenz-in-javascript –

+0

Sieht aus wie [Der UTF-8-Name des Benutzers in Javascript überprüfen] (http://stackoverflow.com/questions/6381752/ validating-users-utf-8-name-in-javascript) – Abhijit

Antwort

1

Ich glaube, Sie missverstehen, was "UTF-8 Zeichen" bedeutet. UTF-8 ist eine Kodierung von Unicode, die ziemlich genau jedes einzelne Zeichen und jede Glyphe repräsentieren kann, die jemals in der aufgezeichneten menschlichen Geschichte existierten, so dass es im Umfang keine "ungültigen" UTF-8-Zeichen gibt.

RTF ist ein Formatierungssystem, das unabhängig vom zugrunde liegenden Codierungssystem funktioniert - Sie können RTF mit ASCII, UTF-8, UTF-16 und anderen verwenden. Textfelder in HTML berücksichtigen nur reinen Text, so dass jede RTF-Formatierung automatisch entfernt wird (es sei denn, Sie verwenden eine "Rich-Edit" -Komponente, von der ich annehme, dass Sie sie nicht sind).

Aber Sie beschreiben Dinge wie Leerzeichen Zeichen (wie Tabs: \t) sind in Unicode (und so, UTF-8) dargestellt. Ein String, der diese Zeichen enthält, ist immer noch "gültig UTF-8", er ist nur ungültig, soweit es Ihre geschäftlichen Anforderungen betrifft.

Ich schlage vor, Stripping-out nur unerwünschte Zeichen einen regulären Ausdruck verwenden, die nicht sichtbaren Zeichen entspricht (von hier: Match non printable/non ascii characters and remove from text)

textBoxContent = textBoxContent.replace(/[^\x20-\x7E]+/g, ''); 

Der Ausdruck [^\x20-\x7E] jedes Zeichen nicht in der Codepoint Bereich 0x20 (32 , ein normales Leerzeichen ' ') bis 0x7E (127, das tidel '~' Zeichen), alle anderen werden entfernt.

Unicode ersten 127 Codepunkte sind identisch mit ASCII und kann hier gesehen werden: http://www.asciitable.com/

+1

Um einige Missverständnisse in dieser Antwort auch zu korrigieren: Es gibt keine UTF8 "Zeichen"; als Codierungsschema gibt es "UTF8-Byte-Sequenzen", die Unicode-Codepunkte codieren, und diese Byte-Sequenzen können * absolut * unter unzulässigen Werten in der Byte-Sequenz leiden. Ähnlich hat Unicode als die formale Zuordnung von "orthographischen Konstrukten" zu numerischen Codes * auch * bestimmte Zahlen, die nicht verwendet werden können. Es ist durchaus möglich, einen UTF8-Bytestream mit einer unzulässigen Bytefolge oder eine decodierte Unicode-Sequenz mit ungültigen Zahlen zu treffen. Ja, es gibt "ungültige UTF-8-Zeichen". –

-1

Nur eine Idee:

Sie
function checkUTF8(text) { 
    var utf8Text = text; 
    try { 
     // Try to convert to utf-8 
     utf8Text = decodeURIComponent(escape(text)); 
     // If the conversion succeeds, text is not utf-8 
    }catch(e) { 
     // console.log(e.message); // URI malformed 
     // This exception means text is utf-8 
    } 
    return utf8Text; // returned text is always utf-8 
} 
+0

'Escape 'ist veraltet und sollte nicht verwendet werden (weil Unicode nicht richtig behandelt werden kann) – Quentin

Verwandte Themen