Berechnung der Länge eines japanischen Multibyte-Strings mit halber Breite in PHP

8

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ück

Gibt 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?

    
icchanobot 12.04.2011, 09:26
quelle

3 Antworten

0

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.

    
icchanobot 25.04.2011, 03:15
quelle
3

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:

%Vor%

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.

    
一二三 12.04.2011 11:19
quelle
0

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 ™  :)

    
tchrist 25.04.2011 03:57
quelle

Tags und Links