Also habe ich eine UTF-8 codierte Zeichenfolge, die Kanji mit voller Breite, Kana mit voller Breite, Kana mit halber Breite, Romaji, Zahlen oder kawaii japanische Symbole wie ★ oder ♥ enthalten kann.
Wenn ich die Länge haben möchte, verwende ich mb_strlen()
und es zählt jede von diesen als 1 in der Länge. Was für die meisten Zwecke in Ordnung ist.
Aber ich wurde (von einem japanischen Kunden) gebeten, die halbe Breite Kana nur als 0,5 zu zählen (zum Zwecke der maximalen Länge eines Textfelds), weil das offensichtlich ist, wie es japanische Webseiten tun. Ich mache das mit mb_strwidth()
, was die volle Breite als 2 und die halbe Breite als 1 zählt, dann teile ich einfach durch 2.
Allerdings zählt diese Methode auch Romaji-Zeichen als 1, also würde etwas wie Chocアイス
als 7 zählen. Dann würde ich durch 2 teilen, um Kanji zu berücksichtigen, und ich würde 3,5 bekommen. aber ich will eigentlich 5,5 (4 für die Romaji + 1,5 für die 3 halbe Kana).
// BEARBEITEN:
einige weitere Informationen: jedes Zeichen (auch Nicht-Kana), das sowohl eine volle als auch eine halbe hat, sollte 1 für die volle Breite und 0,5 für die halbe Breite sein. Zum Beispiel sollten Zeichen wie ¥、3@(
alle 1 sein, aber Zeichen wie ¥,3@(
sollten alle 0,5 sein
// EXTRA EDIT: Symbole wie ☆ und ♥ sollten 1 sein, aber die Methode mb_strwidth / 2 gibt sie als 0.5
zurückGibt es eine Standardmethode, nach der japanische Systeme die Stringlänge zählen? Oder durchläuft jeder einfach seine Strings und zählt die Zeichen, die nicht den Standardbreitenregeln entsprechen?
Also, ich habe keine Antwort dafür gefunden.
Ich reparierte es, indem ich buchstäblich durch alle Buchstaben iterierte und prüfte und manuell die Zählregeln anwendete, nach denen mein Klient verlangte.
Eine Möglichkeit besteht darin, die Katakana mit halber Breite in die volle Breite zu konvertieren und den Unterschied in der Breite von der ursprünglichen Länge zu subtrahieren:
Allerdings , sind Sie sicher , dass Sie grundlegende lateinische Zeichen als volle Breite betrachten sollten? Es gibt auch Varianten der lateinischen Zeichen in voller Breite - also, sollte Choc
als Choc
betrachtet werden?
Normalerweise hätten Zeichen wie "A" und "ア" eine Breite von 1, aber "A" und "ア" hätten eine Breite von 2 (was mb_strwidth
auch tut). Ich wäre vorsichtig, wenn ich das hacken müsste.
Wenn Sie Ihre Eingabe bearbeiten , macht mb_strwidth
(oder mb_strwidth/2
) genau das, was Sie wollen.
Sehen Sie sich Perls Unicode :: GCString -Modul an: Es gibt die richtigen Spalten für alle Unicode, einschließlich das ostasiatische Zeug.
Es ist eine grundlegende Komponente von Unicode :: LineBreak , die ich absolut unentbehrlich gefunden habe richtige Textsegmentierung von asiatischen Skripten.
Wie Sie sich gut vorstellen können, sind beide Made in Japan ™ :)
Tags und Links php character-encoding unicode