Skip to content

Alles für WordPress, Webentwicklung — und mehr

🔢 Zahlenübersetzung mit PHP und JavaScript: Arabische Ziffern zu Devanagari und zurück

🔢 Zahlenübersetzung mit PHP und JavaScript: Arabische Ziffern zu Devanagari und zurück

Ein Nutzer füllt ein Formular auf einer Website aus, und die Zahlen verwandeln sich in unlesbare Zeichen. Dies ist eine vertraute Situation für jeden, der mit mehrsprachigen Projekten arbeitet: Die nepalesische Version eines Online-Shops zeigt Preise in अक्षर an, und das Kontaktformular schlägt bei der Validierung wegen „falscher" Ziffern fehl.

Das Problem besteht darin, dass verschiedene Sprachen unterschiedliche Zahlensysteme verwenden. Englisch und Russisch nutzen arabische Ziffern (0-9). Hindi, Nepali und Marathi verwenden Devanagari-Symbole (०-९). PHP und JavaScript schalten zwischen ihnen nicht von Haus aus um. Dennoch lässt sich die Aufgabe ohne eine einzige externe Bibliothek lösen, nur mit eingebauten String-Funktionen. Keine Abhängigkeiten zu installieren, keine Drittanbieter-APIs.

Nachfolgend finden Sie zwei einsatzbereite Code-Snippets, die dieses Problem in 5 Minuten lösen. Keine Frameworks, keine Composer-Pakete, keine npm-Abhängigkeiten, nur reines PHP und Vanilla-JavaScript. Kopieren Sie sie, ersetzen Sie Ihre Symbole, und es funktioniert.

💡 Kurzüberblick:

  • Kopieren Sie die PHP-Funktion in die functions.php Ihres Themes oder über das Code Snippets-Plugin; sie konvertiert arabische Ziffern in Devanagari und zurück
  • Für das Frontend nutzen Sie den fertigen JavaScript-Code mit Wörterbuch-Objekten für die spontane Konvertierung direkt im Eingabefeld
  • Die Ersetzung verwendet eine Glyphen-Zuordnungstabelle statt Mathematik, was die Methode universell für jedes Schriftsystem macht
  • Testen Sie es: Übergeben Sie 1234 und erhalten Sie १२३४ und umgekehrt; beide Richtungen arbeiten symmetrisch

Wie Zahlensysteme in verschiedenen Sprachen funktionieren

Die meisten Websites arbeiten mit arabischen Ziffern: 0 1 2 3 4 5 6 7 8 9. Historisch stammt dieses System aus Indien, verbreitete sich aber über die arabische Welt, daher der Name.

Alternative Zeichensätze existieren in Dutzenden von Schriftsystemen. Devanagari (Hindi, Nepali, Marathi) verwendet seine eigene Reihe: ० १ २ ३ ४ ५ ६ ७ ८ ९. Östliche arabische Ziffern (Arabisch, Persisch, Urdu) nutzen einen anderen Satz: ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩. Bengalisch, Thailändisch und Khmer haben jeweils eigene Glyphen und eigene Unicode-Bereiche. Insgesamt gibt es mehr als zwanzig solcher Systeme.

Der numerische Wert bleibt jedoch derselbe. 5, und ٥ sind alle dieselbe Zahl „fünf", nur mit unterschiedlichen Symbolen geschrieben. Daher ist die Übersetzung zwischen Systemen eine Glyphenersetzung mittels einer Zuordnungstabelle, keine mathematische Konvertierung. Es gibt nichts umzurechnen; man muss nur die korrekten Symbolpaare kennen.

Genau dies ist das Prinzip hinter dem nachfolgenden Code.

Schritt 1: Zahlen mit PHP konvertieren

Programmierer arbeitet an einem Laptop mit geöffnetem Code-Editor

Der PHP-Ansatz ist so einfach wie nur möglich: Die Funktion str_replace() nimmt zwei Arrays entgegen, was zu suchen und womit zu ersetzen ist. Die Zeichenkette wird in einem einzigen Durchlauf verarbeitet, und alle Treffer werden ersetzt.

Fügen Sie diesen Code zur functions.php Ihres Child-Themes oder über das Code Snippets-Plugin hinzu. Die Funktion akzeptiert eine Zahl oder eine Zeichenkette, die Ziffern enthält, und gibt das Ergebnis mit Devanagari-Symbolen zurück.

1<?php
2/**
3 * Converts Arabic numerals to Devanagari characters (Hindi, Nepali).
4 *
5 * @param string|int $input String or number to convert.
6 * @return string String with Devanagari numerals.
7 */
8function convert_to_devanagari($input) {
9 $english = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
10 $devanagari = array("०", "१", "२", "३", "४", "५", "६", "७", "८", "९");
11
12 return str_replace($english, $devanagari, (string) $input);
13}
14
15/* Usage example */
16echo convert_to_devanagari(2026);
17// Output: २०२६
18?>

Was hier passiert: str_replace() iteriert durch das $english-Array und ersetzt für jedes Element (zum Beispiel "2") das entsprechende Element aus $devanagari ("२"). Die Umwandlung in (string) stellt sicher, dass die Funktion sowohl mit Zahlen als auch mit Zeichenketten arbeitet.

Die Rückkonvertierung, von Devanagari zu arabischen Ziffern, erfolgt durch Vertauschen der Arrays:

1<?php
2/**
3 * Converts Devanagari characters back to Arabic numerals.
4 *
5 * @param string $input String with Devanagari numerals.
6 * @return string String with Arabic numerals.
7 */
8function convert_from_devanagari($input) {
9 $english = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
10 $devanagari = array("०", "१", "२", "३", "४", "५", "६", "७", "८", "९");
11
12 return str_replace($devanagari, $english, $input);
13}
14
15/* Example */
16echo convert_from_devanagari('२०२६');
17// Output: 2026
18?>

Die Arrays sind dieselben; nur die Reihenfolge der Argumente ändert sich. Das erste Array enthält nun Devanagari-Symbole (was wir suchen), das zweite enthält arabische Ziffern (womit wir ersetzen).

Wo einzusetzen. Die Funktion ist überall im Theme nützlich, wo Zahlen angezeigt werden: Produktpreise in WooCommerce, Daten in Blogbeiträgen, Seitennummerierung. Umschließen Sie den Aufruf überall dort, wo Sie eine Ziffern-Lokalisierung für eine bestimmte Zielgruppe benötigen.

Behandlung von Sonderfällen in PHP

Die Funktion convert_to_devanagari() akzeptiert string|int, aber in der Praxis kann die Eingabe alles Mögliche sein. Was passiert, wenn Sie null, eine leere Zeichenkette oder eine Zeichenkette ohne Ziffern übergeben? (string) null gibt eine leere Zeichenkette zurück, und str_replace() mit einer leeren Zeichenkette gibt ebenfalls leer zurück, ohne Fehler. Eine Zeichenkette ohne Ziffern (zum Beispiel "Hello") wird unverändert zurückgegeben, da die Ersetzung keine Treffer findet.

Enthält die Zahl Trennzeichen (Kommas für Tausender, einen Punkt für Dezimalstellen), bleiben diese an Ort und Stelle; nur die Ziffern selbst werden ersetzt. Für Gleitkommazahlen ist dieses Verhalten korrekt, aber wenn die Zahlenformatierung eine Rolle spielt und Trennzeichen gemäß der Locale geändert werden sollen, fügen Sie vor der Konvertierung eine separate Verarbeitung mittels number_format() hinzu.

Für sehr lange Zahlen (zum Beispiel 20-stellige Kennungen) funktioniert der Ansatz unverändert: str_replace() verarbeitet Zeichenketten beliebiger Länge, begrenzt nur durch den verfügbaren PHP-Speicher. Devanagari-Zeichen belegen in UTF-8 jeweils 3 Bytes, sodass die resultierende Zeichenkette in Bytes länger sein wird als das Original. Verwenden Sie für die Zeichenzählung mb_strlen(), nicht strlen().

Schritt 2: Zahlen mit JavaScript konvertieren

Im Frontend wird dieselbe Logik mittels Wörterbuch-Objekten und der Methode String.replace() mit einem regulären Ausdruck implementiert. Dies ist praktisch für dynamische Oberflächen: Der Nutzer gibt eine Zahl in ein Feld ein, und das Skript zeigt sofort das Devanagari-Äquivalent an.

Platzieren Sie diesen Code in einer separaten .js-Datei in Ihrem Theme oder über wp_add_inline_script in der functions.php. Keine Abhängigkeiten, reines ES5, funktioniert selbst in alten Browsern.

1/**
2 * Dictionaries for translating between Arabic numerals and Devanagari.
3 */
4var englishToDevanagari = {
5 '0': '०', '1': '१', '2': '२', '3': '३', '4': '४',
6 '5': '५', '6': '६', '7': '७', '8': '८', '9': '९'
7};
8
9var devanagariToEnglish = {
10 '०': '0', '१': '1', '२': '2', '३': '3', '४': '4',
11 '५': '5', '६': '6', '७': '7', '८': '8', '९': '9'
12};
13
14/**
15 * Converts Arabic numerals in a string to Devanagari characters.
16 * @param {string|number} input
17 * @returns {string}
18 */
19function toDevanagari(input) {
20 return String(input).replace(/[0-9]/g, function(match) {
21 return englishToDevanagari[match];
22 });
23}
24
25/**
26 * Converts Devanagari characters to Arabic numerals.
27 * @param {string} input
28 * @returns {string}
29 */
30function fromDevanagari(input) {
31 return input.replace(/[०-९]/g, function(match) {
32 return devanagariToEnglish[match];
33 });
34}
35
36// Examples:
37console.log(toDevanagari(9857)); // ९८५७
38console.log(fromDevanagari('१२३४')); // 1234

Der entscheidende Punkt ist der reguläre Ausdruck /[0-9]/g. Das g-Flag (global) bewirkt, dass replace() jede Ziffer in der Zeichenkette verarbeitet, nicht nur die erste. Die anonyme Callback-Funktion erhält das gefundene Zeichen und gibt sein Äquivalent aus dem Wörterbuch zurück.

Für Devanagari-Ziffern wird der Bereich [०-९] verwendet; in Unicode sind diese Zeichen sequenziell, sodass der reguläre Ausdruck korrekt arbeitet.

Wo einzusetzen. Live-Eingabe in Formularen (spontane Konvertierung während des Tippens), Anzeige von Preisen und Daten in lokalisierten Versionen der Website, Rückkonvertierung vor dem Absenden des Formulars an den Server, sodass stets arabische Ziffern in der Datenbank ankommen.

Praxisbeispiel: Kontaktformular mit spontaner Konvertierung

Lassen Sie uns beide Ansätze zu einem funktionierenden Setup kombinieren. Angenommen, die nepalesische Version einer Website hat ein Bestellformular, in das der Nutzer einen Betrag in Devanagari eingibt. Die Aufgabe: Die eingegebene Zahl zur Überprüfung in beiden Systemen anzeigen und arabische Ziffern an den Server senden.

Das Formular-Markup enthält ein <input> und einen Vorschau-Block. Bei jedem Tastenanschlag im Feld wird der input-Event-Handler ausgelöst, ruft toDevanagari() auf und zeigt das Ergebnis in einem benachbarten <span> an. Beim Absenden des Formulars wird fromDevanagari() ausgelöst, und der an den Server gesendete POST-Request-Body enthält arabische Ziffern. Der serverseitige PHP-Code empfängt die Zahl im Standardformat und arbeitet wie gewohnt damit, ohne zusätzliche Konvertierung.

Dasselbe Muster gilt für Preisfelder, Daten, Telefonnummern und alle anderen Felder, bei denen der Nutzer sein natives Zahlensystem erwartet, während das System ein einheitliches Format speichern muss. Die Konvertierung dauert Mikrosekunden und beeinträchtigt die Reaktionsfähigkeit der Oberfläche nicht.

Siehe auch: Video zu Zahlensystemen in der Programmierung

Für einen breiteren Blick auf das Thema, wie Zahlensysteme im Code funktionieren und wie man in JavaScript zwischen ihnen konvertiert, sehen Sie sich diese Aufschlüsselung von Techno Geek an. Sie behandelt binäre, oktale und dezimale Systeme mit einem fertigen Projekt.

⁉️🤔 Häufig gestellte Fragen

Kann dieselbe Methode Ziffern in Arabisch (östliche arabische Symbole) konvertieren?

Ja. Ersetzen Sie das Devanagari-Array durch östliche arabische Symbole: array("٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"). Die Logik ist dieselbe: str_replace() in PHP und ein Wörterbuch mit regulärem Ausdruck in JS. Es passt sich ebenso leicht an Bengalisch, Thailändisch, Khmer und jedes andere Schriftsystem mit eigenen numerischen Glyphen an.

Ist es sicher, str_replace() für Multibyte-Zeichenketten in PHP zu verwenden?

Ja, str_replace() arbeitet korrekt mit UTF-8 und Multibyte-Zeichen, im Gegensatz zu strpos() oder substr(), die mbstring-Äquivalente benötigen. Devanagari-Symbole (, ) belegen in UTF-8 jeweils 3 Bytes, aber str_replace() behandelt sie byte-sicher, da es nach exakten binären Sequenzübereinstimmungen sucht. Es wird keine Probleme geben.

Was, wenn die Zeichenkette eine Mischung aus arabischen Ziffern und Devanagari-Symbolen enthält?

Beide Funktionen verarbeiten nur ihre jeweiligen Bereiche. Wenn convert_to_devanagari() die Zeichenkette "Price: 500 रुपय" erhält, wird die Ziffer 500 zu ५००, während der Text unberührt bleibt. Die Umkehrfunktion convert_from_devanagari() betrifft nur Devanagari-Ziffern. Gemischte Eingaben werden automatisch korrekt behandelt.

Wie kann ich die Konvertierung auf alle Zahlen einer WordPress-Seite anwenden, ohne jedes Template zu bearbeiten?

Verwenden Sie den JavaScript-Ansatz aus Schritt 2 und führen Sie beim Laden der Seite eine DOM-Knoten-Durchquerung durch. Finden Sie alle Textknoten, die Ziffern enthalten (via TreeWalker oder rekursive childNodes-Durchquerung), und wenden Sie toDevanagari() auf ihren Inhalt an. Für den PHP-Ansatz auf der Serverseite nutzen Sie einen Filter auf the_content oder gettext, wenn Zahlen in Übersetzungen eingebettet sind.

Wo finde ich Zeichentabellen für andere Schriftsysteme?

Die maßgebliche Quelle ist das Unicode-Konsortium. Für Devanagari-Ziffern ist dies der Bereich U+0966-U+096F. Östliches Arabisch ist U+0660-U+0669. Bengalisch ist U+09E6-U+09EF. Kopieren Sie einfach die Zeichen aus der Tabelle und setzen Sie sie in die Arrays ein; der Code muss nicht geändert werden.

Leistung und Grenzen des Ansatzes

str_replace() mit Arrays von 10 Elementen führt genau 10 Vergleiche für jede Position in der Zeichenkette durch. Für eine typische Zeichenkette mit 5-10 Ziffern bedeutet dies 50-100 Operationen; die Ausführungszeit wird in Mikrosekunden gemessen. Zum Vergleich: Der Ansatz mit preg_replace_callback() und einem regulären Ausdruck verursacht Overhead für die Musterkompilierung und den Callback-Aufruf für jeden Treffer. Der Unterschied ist bei kleinen Zeichenketten nicht wahrnehmbar, aber str_replace() gewinnt bei großen Volumina.

Die Hauptbeschränkung des Ansatzes besteht darin, dass er Glyphen ersetzt, nicht die Semantik der Zahl. Wenn Sie Arithmetik mit Devanagari-Zahlen benötigen (Addition, Multiplikation), werden Devanagari-Symbole von PHP nicht als Zahlen erkannt. Konvertieren Sie vor mathematischen Operationen immer in arabische Ziffern und danach zurück. Dies ist kein Mangel der Methode, sondern eine Konsequenz des Unterschieds zwischen Schriftsystemen und numerischen Datentypen.

Eine weitere Nuance: Die Methode setzt eine Eins-zu-eins-Entsprechung von „eine Glyphe, eine Ziffer" voraus. Für Schriftsysteme, in denen Zahlen mit zusammengesetzten Ligaturen geschrieben werden (wie in einigen historischen Systemen), wird der einfache Ersetzungsansatz nicht funktionieren. Aber für alle modernen indischen Schriften (Devanagari, Bengalisch, Gurmukhi, Gujarati, Odia, Tamil, Telugu, Kannada, Malayalam) sowie für östliche arabische Ziffern ist die Entsprechung strikt 1 zu 1, und die Methode funktioniert einwandfrei.

Was für die Produktion bereitstellen: PHP, JavaScript oder beides?

Die PHP-Lösung ist für Fälle gedacht, in denen Zahlen vor dem Senden des HTML im Zielzeichensystem auf dem Server gerendert werden müssen. Dies ist korrekt für SEO: Die Suchmaschine sieht den Inhalt sofort in der Ziel-Locale, nicht arabische Ziffern, die dann durch ein Skript ersetzt werden. Für einen WooCommerce-Shop bedeutet dies, dass Katalog- und Produktseitenpreise mit Devanagari-Ziffern indexiert werden, was sich positiv auf das Ranking in den nepalesischen und Hindi-Segmenten auswirkt.

Die JavaScript-Variante ist für dynamische Interaktion: ein Eingabefeld mit Sofortvorschau, Sprachwechsel ohne Seitenneuladen, Konvertierung von Formulardaten vor dem Absenden. Sie ist auch unverzichtbar für Single-Page-Anwendungen (SPA), bei denen der Server JSON mit arabischen Ziffern zurückgibt und das Frontend diese in der Locale des Nutzers rendert.

In der Praxis funktioniert eine Kombination gut: PHP rendert die Seite mit lokalisierten Ziffern für die Indexierung, während JavaScript die Nutzereingaben verarbeitet und spontan hin- und herkonvertiert. Beide Code-Snippets, ohne externe Abhängigkeiten, umfassen zusammen weniger als 40 Zeilen und lösen die Aufgabe vollständig für jedes Schriftsystem mit eigenen numerischen Glyphen.

Testen Sie vor der Bereitstellung in der Produktion drei Szenarien: einen direkten Funktionsaufruf mit einer Zahl, eine Zeichenkette mit gemischtem Inhalt (Ziffern plus Text) und die Rückkonvertierung. Stellen Sie sicher, dass stets arabische Ziffern den Server erreichen und die Oberfläche dem Nutzer das System zeigt, das seinen sprachlichen Erwartungen entspricht. Fünf Minuten Testen sparen Stunden der Fehlersuche im Live-Betrieb.

Kopieren Sie beide Code-Snippets in Ihr Projekt, ersetzen Sie die benötigten Symbole aus der Unicode-Tabelle für Ihr Schriftsystem, und die Aufgabe ist erledigt. Alles, was Sie benötigen, ist bereits in der Sprache eingebaut.