Wie finde ich heraus, ob eine bestimmte Zeichenkette Unicode-Zeichen hat (besonders Double Byte-Zeichen)
Um genauer zu sein, muss ich wissen, ob (und wenn möglich wie) kann ich feststellen, ob eine gegebene Zeichenkette double-byte-Zeichen oder nicht. Im Grunde brauche ich um zu öffnen ein pop-up-anzeigen, die einen bestimmten text enthalten können Doppel-byte-Zeichen wie Chinesisch oder Japanisch. In diesem Fall müssen wir passen die Größe des Fensters, als wäre es für Englisch oder ASCII.
Hat jemand eine Ahnung?
Kommentar zu dem Problem - Öffnen
Gut, ich erwartet, dass dies funktioniert. Aber es hat nicht funktioniert im IE. Ich denke, dass einige layout-Probleme. Anyways, da der code zum berechnen der text-zu-sein-gezeigt, die Länge und die Höhe/Breite war schon da, ich ging voran mit dem code, der nur feststellt, ob es ein Doppel-byte-Zeichen oder nicht. Und diese lösen.
Mit HTML5, können Sie den Kontext des Canvas-Elements (
var ctx = canvas.getContext('2d')
), um die Breite text-Metrik. var text_width = ctx.measureText(text).Breite;
ich bin mir nicht sicher, wie gut diese Methode funktioniert auch mit unicode-Zeichen, und es ist eine Schande, dass alle - measureText
- Methode derzeit gibt Breite. InformationsquelleAutor der Frage Jay | 2008-09-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
JavaScript hält text intern als UCS-2, die codieren kann einen ziemlich umfangreichen Teilmenge von Unicode.
Aber das ist nicht wirklich relevant für deine Frage. Eine Lösung könnte sein, die Schleife durch die Kette und untersuchen Sie die Zeichen-codes an jeder position:
Dies vielleicht nicht so schnell, wie Sie möchten.
InformationsquelleAutor der Antwort pcorcoran
Ich verwendet mikesamuel Antwort auf diese ein. Allerdings habe ich bemerkt, vielleicht, weil von dieser form, sollte es nur eine Flucht Schrägstrich vor der
u
z.B.\u
und nicht\\u
um diese Arbeit zu machen, richtig.Funktioniert für mich 🙂
InformationsquelleAutor der Antwort james
Eigentlich alle Zeichen sind Unicode, zumindest von der Javascript-engine Perspektive.
Leider ist die bloße Anwesenheit von Zeichen in einer bestimmten Unicode-Bereich nicht genug sein wird, um zu bestimmen, braucht man mehr Platz. Es gibt eine Reihe von Zeichen, die nehmen ungefähr den gleichen Raum ein wie andere Zeichen die Unicode-codepoints auch oberhalb des ASCII-Bereichs. Typografische Anführungszeichen, Zeichen mit diakritischen Zeichen, bestimmte Satzzeichen und verschiedene Währungssymbole sind außerhalb des low-ASCII-Bereichs und verteilt werden, sind in ganz unterschiedlichen Orten auf der Unicode basic multilingual plane.
Allgemein, Projekte, an denen ich gearbeitet habe, Wahl bieten zusätzlichen Platz für alle Sprachen, oder manchmal auch javascript verwenden, um zu bestimmen, ob ein Fenster mit auto-scrollbar css-Attribute tatsächlich hat der Inhalt mit einer Höhe, die auslösen würde, eine Bildlaufleiste oder nicht.
Wenn das ermitteln des Vorhandenseins oder der Anzahl von CJK-Zeichen ist ausreichend, um zu bestimmen, brauchen Sie ein bisschen extra Raum, Sie bauen könnten, die eine regex mit den folgenden Bereichen:
[\u3300-\u9fff\uf900-\ufaff], und extrahieren Sie die Anzahl von Zeichen, die übereinstimmen. (Dies ist ein wenig übermäßig grob, und findet, dass alle nicht-BMP Fällen, wahrscheinlich schließt einige andere relevante Bereiche und enthält wahrscheinlich einige irrelevante Zeichen, aber es ist ein Ausgangspunkt).
Wieder, du bist nur in der Lage sein zu verwalten, eine grobe Heuristik, ohne etwas entlang der Linien von einer full-text-rendering-engine, weil das, was Sie wirklich wollen, ist so etwas wie die GDI-MeasureString (oder jeder andere text-rendering-engine entspricht). Es ist schon eine Weile her, seit ich getan habe, aber ich denke, dass die nächste HTML - /DOM-äquivalent ist die Einstellung der Breite auf ein div und anfordern der Höhe (Ausschneiden und einfügen wiederverwenden, also entschuldigt, wenn dieses Fehler enthält):
InformationsquelleAutor der Antwort
Habe ich zudem die beiden Funktionen in die top-Antworten und dachte, ich würde teilen die Ergebnisse. Hier ist der test-code, den ich verwendet:
Beim ausführen dieser bekam ich:
Also für diese bestimmte Zeichenfolge, die der regex-Lösung ist etwa 3 mal schneller.
Jedoch beachten Sie, dass für eine Zeichenfolge, wobei das erste Zeichen ist unicode
isDoubleByte()
gibt rechts entfernt, und so ist viel schneller als die regex (die noch den overhead des regulären Ausdrucks).Zum Beispiel für die Zeichenfolge
中国
ich bekam diese Ergebnisse:Erhalten das beste aus beiden Welt, ist es wahrscheinlich besser, beide miteinander zu kombinieren:
In diesem Fall, wenn das erste Zeichen ist Chinesisch (was wahrscheinlich ist, wenn der ganze text ist Chinesisch), wird die Funktion schnell und Rückgaberecht Weg. Wenn nicht, wird es laufen die regex, die ist immer noch schneller als die überprüfung jedes Zeichen einzeln.
InformationsquelleAutor der Antwort this.lau_
Warum lassen Sie nicht die Fenster verkleinern sich, basierend auf der Laufzeit Höhe/Breite?
Führen Sie so etwas in Ihrem pop-up:
InformationsquelleAutor der Antwort Oli