Wie kann ich sicherstellen, dass der text kodiert, in einer form ist utf8
Ich habe eine html-box, mit der Benutzer kann text eingeben. Ich möchte sicherstellen, dass alle eingegebene text in der box ist entweder in UTF-8 kodiert oder in UTF-8 konvertiert, wenn ein Benutzer beendet die Eingabe. Außerdem, ich verstehe nicht ganz, wie die verschiedenen UTF-Kodierung gewählt werden, wenn Sie in ein Textfeld eingegeben.
Generell bin ich neugierig auf die folgenden:
- Wie funktioniert ein browser bestimmen, welche Kodierungen zu verwenden, wenn ein Benutzer die Eingabe in ein Textfeld?
- Wie kann javascript bestimmen Sie die Codierung einer Zeichenfolge in ein html-Textfeld?
- Kann ich zwingen, den browser zu verwenden, der UTF-8 Codierung?
- Wie kann ich encodieren beliebigen encodings auf UTF-8 ich vermute es ist eine JavaScript-Bibliothek für diese?
** Edit **
Entfernt einige unnötige Fragen, um meine Ziele zu erreichen.
Diesem tutorial half mir zu verstehen JavaScript-Charakter-codes besser, aber buggy ist und nicht wirklich übersetzen von Zeichencodes utf-8 in allen Fällen.
http://www.webtoolkit.info/javascript-base64.html
- Das sind eine Menge Fragen! Tun wir haben, Sie alle zu beantworten, um die post eine Antwort?
- Byers überhaupt nicht, ich fühlen Sie sind im Zusammenhang mit dem problem, das ich zu lösen versuche. Antworten auf die ersten 4 Fragen gestellt die mich näher zu meiner Lösung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es nutzt die Codierung der Seite wurde entschlüsselt als standardmäßig. Nach die Skillung, Sie sollten in der Lage sein, dies zu ändern, mit der
accept-charset
Attribut des<form>
element, aber der IE ist buggy, daher sollten Sie nicht auf diese angewiesen sind (ich habe verschiedene Quellen beschreiben verschiedene Fehler, und ich habe nicht alle relevanten IE-Versionen vor mir zu testen, also werde ich es dabei belassen).Alle strings in JavaScript codiert in UTF-16. Der browser anzeigen wird alles in UTF-16 für JavaScript, und von UTF-16 in das, was die Seite codiert ist.
UTF-16 ist eine Kodierung, die wuchsen aus UCS-2. Ursprünglich war es gedacht, dass zu 65.536 code points wäre genug für alle Unicode, und so ein 16-bit-Zeichenkodierung, die ausreichen würde. Es stellte sich heraus, dass das nicht der Fall ist, und so der Charakter-set wurde erweitert, um 1,114,112 code Punkte. Um die Abwärtskompatibilität, ein paar unbenutzte Bereiche des 16-bit-Zeichensatz festgelegt wurden beiseite für Surrogat-Paaren, in denen zwei 16-bit-code-Einheiten verwendet wurden zum Kodieren eines einzelnen Zeichens. Lesen Sie auf UTF-16 und UCS-2 auf Wikipedia für details.
Das Ergebnis ist, dass wenn Sie eine Zeichenfolge, die
str
in JavaScriptstr.length
nicht geben Sie die Anzahl der Zeichen, es gibt Sie die Anzahl der code-Einheiten, wobei zwei code-Einheiten können verwendet werden zum codieren eines einzigen Zeichens, wenn dieses Zeichen nicht innerhalb der Basic Multilingual Plane. Zum Beispiel"abc".length
gibt Sie 3, aber"???".length
gibt Ihnen 6; und"???".substring(0,1)
gibt, was aussieht wie eine leere Zeichenfolge ist, da eine Hälfte eines surrogate-pair-Mädchen können nicht angezeigt werden, aber der string enthält ungültige Zeichen (ich werde nicht garantieren das funktioniert cross-browser; ich glaube, es ist akzeptabel, um die drop-broken-Zeichen). Um ein gültiges Zeichen verwenden, müssen Sie"???".substring(0,2)
.Der beste Weg, dies zu tun ist, um Ihre Seite in UTF-8. Sicherzustellen, dass Ihre web-server sendet die entsprechende
Content-type: text/html; charset=UTF-8
Header. Sie können auch einbetten möchten eine<meta charset="UTF-8">
element in Ihrem<head>
element, für Fälle, in denen dieContent-Type
nicht richtig eingestellt (z.B. wenn Ihre Seite geladen wird, ab von der lokalen Festplatte).Gibt es nicht viel brauchen, in JavaScript zu Kodieren text in bestimmten Codierungen. Wenn Sie einfach nur schreiben, um den DOM, oder das Lesen oder ausfüllen von Formular-Steuerelemente, sollten Sie nur verwenden JavaScript-strings, die behandelt werden als Sequenzen von UTF-16 code-Einheiten.
XMLHTTPRequest
, wenn verwendet, umsend(data)
per POST, wird die Verwendung von UTF-8 (wenn Sie übergeben Sie ein Dokument mit einem anderen encoding declared in die<?xml ...>
Erklärung, es kann oder kann nicht konvertieren, die auf UTF-8, so dass für Kompatibilität Sie sollten generell nicht verwenden alles andere als UTF-8).accept-charset
ist gebrochen. Was IE wirklich tut behandelnaccept-charset
als nur eine Sicherung charset zu verwenden, wenn der Zeichensatz entnommen aus der Seite selbst nicht halten den Inhalt des Formularfelds. Das bedeutet, dass wenn das Formular übermittelt wird, können Sie nicht wissen, ob IE verwendet die Seite Codierung oder dieaccept-charset
- Codierung zum codieren eines Formularfeldes (in der Tat, Sie sind wahrscheinlich eine Mischung über das Formular). Dies macht es unmöglich sich zu erholen werden die ursprünglichen Zeichen.accept-charset
; nach einiger recherche habe ich gesehen, dass mehrere Quellen beschreiben die bugs anders, ich habe nicht alle relevanten IE-Versionen vor mir zu testen, und es ist nicht notwendig, jedenfalls, wenn du deine Zeichenkodierung auf die ganze Seite auf UTF-8.Text in einem HTML-DOM einschließlich der input-Felder nicht sonderlich byte-Codierung; ist es gespeichert, wie Unicode-Zeichen (insbesondere bei einer DOM-und ECMAScript-standard, UTF-16 code-Einheiten; für den seltenen Fall, dass Sie die Verwendung von Zeichen außerhalb der Basic Multilingual Plane ist es möglich, den Unterschied zu sehen, zB.
'?'.length
2).Ist es nur, wenn das Formular gesendet wird, wird der text in bytes serialisierte mit einer bestimmten Codierung standardmäßig die gleiche Kodierung verwendet wurde, um eine Analyse der Seite, So dass Sie dazu dienen sollte, Ihre Seite mit dem Formular als UTF-8 (über
Content-Type
headercharset
parameter und/oder gleichwertige<meta>
tag).Zwar im Prinzip gibt es ein override für diese in der
accept-charset
Attribut des<form>
element, funktioniert es nicht richtig (und ist aktiv Schaden, in vielen Fällen) im IE. So vermeiden, dass man.Gibt es keine expliziten encoding-handling-Funktionen in JavaScript zur Verfügung stehen sich. Sie können hacken zusammen einen Unicode in UTF-8-Byte encoder durch die Verkettung
unescape(encodeURIComponent(str))
(und ebenso Umgekehrt mit der inverse-Funktion), aber das ist über es.unescape
worden ist veraltet, zu Gunsten derdecodeURI
. Siehe in dieser Frage ALSO für mehr info.decodeURI
für diesen Zweck, der nichts mit URIs. Decke-ersetzenunescape
mitdecodeURI[Component]
ist keine gute Idee, es sei denn du bist sicher, dass es war in Fehler, wenn die URI-Decodierung gemeint war, und du bist sicher, dass Sie nichtescape
Daten bekommen konnte, entstellt durch die änderung. Diese Funktionen sind jetzt in der "web-browser legacy-Funktionen" Anlage-aber das bedeutet nicht, dass Sie veraltet sind oder wahrscheinlich bald verschwinden. Die neue-Welt-Ersatz für zu diesem Zweck ist die Encoding-API, aber die Unterstützung ist zu schlecht heute.Den text in einem text-Feld wird nicht codiert, in keiner Weise; es ist "text", eine abstrakte Folge von Zeichen. In fast jeder modernen Anwendung, die den text ausgedrückt wird als eine Sequenz von Unicode-Codepunkten, denen sind die ganzen zahlen zugeordnet, insbesondere abstrakte Zeichen. Text nicht "codiert", bis es verwandelt sich in eine Byte-Sequenz, da beim Absenden des Formulars. Zu dieser Zeit, wird die Kodierung bestimmt, indem die Kodierung der HTML-Seite, in dem das Formular angezeigt wird, oder durch die accept-charset-Attribut des form-Elements.