Lateinische Buchstaben in Japanisch – die Tücken von Unicode

Die Zeiten ändern sich.

Dieser Beitrag scheint älter als 5 Jahre zu sein – eine lange Zeit im Internet. Der Inhalt ist vielleicht veraltet.

Ich lerne so viel durch meine Tätigkeit im Forum, aber häufig sind es vor allem Nutzer mit Standardproblemen, die hier immer wieder aufschlagen. Aber manchmal gibt es richtig spannende Fragen, die etwas mehr Recherche erfordern und wo ich richtig dazulernen kann.

Der Threadstarter hatte merkwürdige Zeichen in einem Kommentar seines Blogs. Die Zeichen konnten kopiert werden und sahen so aus:

eXDWP

Normal sah das nicht aus, denn eigentlich hätte es so aussehen sollen:

eXDWP

Die Kollegen im Forum vermuteten CSS-Einstellungen, aber das passte nicht damit zusammen, dass sich das Problem auch im Forum zeigte. Ich habe das merkwürdige „X“-Zeichen einfach mal in einen WordPress-Beitrag meiner Entwicklungsumgebung geworfen und gespeichert. Danach habe ich per phpMyAdmin in die Datenbank geschaut und siehe da, kein „X“ mehr, sondern folgende Zeichenfolge: %ef%bc%b8

Eine Google-Suche später wusste ich, dass es neben dem „echten“ Zeichen „X“ (LATIN CAPITAL LETTER X) auch ein FULLWIDTH LATIN CAPITAL LETTER X gibt. Und das entspricht in hexadezimaler Schreibweise genau meiner Zeichenfolge aus der Datenbank 0xEF 0xBC 0xB8 (efbcb8).

Beides ist aber gültiges UTF-8.

Vielleicht schreibt der Kommentator auf einer asiatischen Tastatur bzw. in einem asiatisch eingestellten OS/Browser …

Der Unicodeblock Halbbreite und vollbreite Formen (engl. Halfwidth and Fullwidth Forms, U+FF00 bis U+FFEF) enthält vollbreite lateinische Buchstaben und Zahlen sowie halbbreite Katakana-Zeichen und Hangeul-Jamos, die in ostasiatischen Zeichensätzen verwendet werden. Halbbreite Zeichen sind nur so breit wie ein lateinischer Buchstabe, vollbreite Zeichen so breit wie ein Han-Ideogramm und zur Verwendung als Einzelbuchstaben oder -zeichen innerhalb ostasiatischer Texte oder einzelne Wörter in vertikalem Text gedacht. Die vollbreiten Zeichen stammen ursprünglich aus 1-Byte-Zeichensätzen.Wikipedia

Super, jetzt hatte ich eine Erklärung für das Phänomen, aber der Nutzer im Forum suchte natürlich nach einer Lösung. Ein Beitrag bei Stackoverflow brachte mich auf einen Lösungsweg mit dem PHP-Befehl mb_convert_kana. Man sollte den Text von „zen-kaku“ zu „han-kaku“ konvertieren. Das entspricht der Option „r“ des PHP-Befehls.

Laut einem Kommentar auf der PHP-Dokuseite ist folgender Code notwendig, damit die Konvertierung funktioniert:

  mb_language("Ja");
  mb_internal_encoding("utf-8");

Das kann ich nicht bestätigen, bei mir funktionierte die Umwandlung auch ohne diese beiden Zeilen.

Fehlt nur noch ein Filter an dem ich diese Funktion hängen kann. Dafür bietet sich pre_comment_content an. Der Filter feuert immer bevor ein Kommentarinhalt in die Datenbank geschrieben wird.

Das bringt uns zu folgendem vollständigem Code für die functions.php eines (Child-)Themes:

function convert_fullwidth_to_halfwidth( $comment_content ) {

  $comment_content = mb_convert_kana($comment_content, "r");

  return $comment_content;
}
add_filter( 'pre_comment_content' , 'convert_fullwidth_to_halfwidth' );

Oder zu folgendem Mini-Plugin:

<?php
/**
 * Plugin Name: Convert Fullwidth to Halfwidth
 * Description: Convert Fullwidth to Halfwidth characters in comments
 * Plugin URI:  https://torstenlandsiedel.de
 * Version:     1.0
 * Author:      Torsten Landsiedel
 * Author URI:  https://torstenlandsiedel.de
 * Licence:     GPL 2
 * License URI: http://opensource.org/licenses/GPL-2.0
 */
 
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

function convert_fullwidth_to_halfwidth( $comment_content ) {

  $comment_content = mb_convert_kana($comment_content, "r");

  return $comment_content;
}

add_filter( 'pre_comment_content' , 'convert_fullwidth_to_halfwidth' );

Kennst du ähnliche Phänomene? Oder funktioniert der Code bei dir nicht? Dann bitte sofort einen Kommentar mit mehr Infos schreiben. Danke!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.