Lokalisierung von Zahlen in Desktop-Anwendungen

8

In der Zahl dezimal von Unicode sind 460 Dezimalzeichen definiert (siehe diese Seite <) / a> für einige Beispiele). Leider konnte ich kein Zeichen finden, das eine Ziffer unabhängig von ihrem Aussehen darstellt. Als Ergebnis werden derzeit nur die westarabischen Ziffern von den meisten Software als Ziffern verstanden. So können Sie beispielsweise keine anderen Zahlen in MS Excel eingeben.

Wenn Unicode (mindestens) 10 Code für die Ziffern 0 bis 9 als reine Zahlen, keine Glyphe, hätte, könnten wir sie in fast allen normalen Anwendungen verwenden, und die Hostumgebung könnte lokalisierte Nummernglyphen entsprechend dem Gebietsschema des Benutzers anzeigen. Außerdem könnten wir jede der 460 dezimalen Unicode-Zahlen verwenden, wenn wir mit Zahlenglyphen als String arbeiten wollen.

Wenn wir dagegen die aktuellen Zeichen U + 0030 bis u + 0039 als reine Ziffern akzeptieren, brauchen wir zehn neue Zeichen für die westarabischen Ziffern. Diese Implementierung scheint auch rückwärtskompatibler zu sein. Auch die Namen der Zeichen U + 0030 bis U + 0039 beziehen sich nicht auf das Aussehen einer bestimmten Nummer.

Natürlich können wir alle 460 dezimalen Zahlen in der App fest codieren und intern mit ihnen als Zahlen behandeln, aber ich suche nach einer geeigneteren Lösung. Das Problem wird komplizierter, wenn wir auch 224 + 464 andere Unicode-Zeichen (Nl-Kategorie + Keine Kategorie) berücksichtigen, die römische und altpersische Zahlen enthalten.

Wie können wir dieses Problem mit einer OS-weiten Lösung lösen?

Siehe auch Nummernlokalisierung in Webanwendungen

    
PHPst 16.12.2012, 08:41
quelle

3 Antworten

6

Ich bin mir nicht ganz sicher, was Sie fragen, aber am nächsten zu einer bestimmten Frage scheint zu sein: "Wie sollten wir in der aktuellen Situation mit Zahlen in mathematischen Anwendungen so umgehen, dass Benutzer ihre lokale Nummer sehen können Glyphen? "

Ganz einfach: Schreiben Sie Ihre eigene mathematische Anwendung. Es wird ein Modell seiner Daten haben, zum Beispiel eine ganze Zahl oder eine reelle Zahl. Es hat auch eine Ansicht dieser Daten, zum Beispiel eine Zeichenkette, die die Zahl in einer Notation ausdrückt, die der Benutzer zu lesen versteht. (Diese Begriffe beziehen sich auf die Model-View-Controller-Architektur .) Schreiben Sie in Ihrer eigenen Anwendung Code für Ihre View, der die Nummer mit arabischen oder alphanumerischen Zeichen oder chinesischen Ziffern oder einer anderen gewünschten Darstellung anzeigt.

Wie Eschlija schreibt, das Common Locale Data Repository (CLDR) und Die Bibliotheken für internationale Klassen für Unicode (ICU) können Ihnen beim Schreiben dieser Anwendung helfen.

Sie schreiben,

  

Ich konnte kein Zeichen finden, das eine Ziffer unabhängig von ihrem Aussehen darstellt. Als Ergebnis werden derzeit nur westliche arabische Zahlenzeichen von den meisten (oder vielleicht allen) Software als Zahlen verstanden. Sie können also keine anderen Zahlen in MS Excel eingeben.

Ich denke, diese drei Sätze haben keine logische Verbindung.

Der Grund, warum Sie keine anderen Zahlen in Microsoft Excel eingeben können, ist, dass Microsoft eine geschäftliche Entscheidung getroffen hat, dass das Excel nützlich genug ist, wenn es Zahlen nur mit westlichen Ziffern darstellt und es nicht notwendig ist, die mehrsprachige Tabelle zu erstellen du suchst.

Der Grund, warum zur Zeit nur arabischsprachige Zeichen von den meisten (oder vielleicht allen) Software als Zahlen verstanden werden, liegt daran, dass viele andere Softwareentwickler die gleiche geschäftliche Entscheidung getroffen haben wie Microsoft. Es ist nicht, wie Ziffern in Unicode codiert sind.

Sie haben Recht, dass der Unicode-Standard kein Zeichen enthält, das eine Ziffer unabhängig von ihrem Aussehen darstellt. Das liegt daran, dass der Unicode-Standard sich mit Zeichen beschäftigt und ein sehr detailliertes Modell dessen verwendet, was Zeichen sind und welche nicht. Der Unicode-Standard (normalerweise) nicht mit anderen abstrakten Datenmodell-Entitäten.

Also: gehen Sie und schreiben Sie die mathematische Anwendung, die das gewünschte Verhalten hat. Die Plattform und die APIs stehen Ihnen offen. Der Unicode-Standard und CLDR und ICU bieten Ihnen Werkzeuge. Tue tolle Sachen!

Sie fügen hinzu:

  

Natürlich können wir alle 460 dezimalen Ziffern in der App fest codieren und intern mit ihnen als Zahlen behandeln, aber ich suche nach einer geeigneteren Lösung .... Wie können wir dieses Problem mit einer OS-weiten Lösung lösen?

Was sind Ihre Kriterien, um eine Lösung für "geeignet" zu erklären? Das Festcodieren der dezimalen Zahlzeichen oder das spezifische Schreiben einer Reihe von sprachspezifischen Routinen, um zwischen abstrakten Zahldatentypen in Textdarstellungen in verschiedenen Sprachen zu konvertieren, ist die einzige Möglichkeit, die ich sehe. Mit einer "OS-weiten Lösung" meinen Sie eine Lösung, die Sie in das Betriebssystem installieren können, und sie wird das Verhalten bestehender Anwendungen ändern. Nun, Sie können darauf hoffen, aber ich denke nicht, dass es sich um aktuelle Betriebssysteme handelt.

Beachten Sie, dass die sprachspezifischen Routinen möglicherweise mit der RuleBasedNumberFormat -Klasse der ICU implementiert werden können . Diese Klasse kann eine abstrakte Zahl als eine Textfolge wie '(zB 25,3476 als "fünfundzwanzigtausenddreihundertsechsundsiebzig" oder "vingt-cinq mille trois cents soixante-seize" oder "fünfundzwanzigstedreihundertsechsundsiebzig") formatieren. . Man kann wahrscheinlich Code mit dieser Klasse schreiben, um Zahlen zu formatieren, die einen der 46 von Ihnen identifizierten Zifferngruppen verwenden. Die Anwendungssoftware muss jedoch noch die ICU und den Zahlenformatcode enthalten.

Update : Meine Antwort wurde geändert, um die Änderungen in der ursprünglichen Posterfrage zu verfolgen. Antwort auf Aufruf für "OS-Wide-Lösung" hinzugefügt. Repariert einen Link zu Wikipedia unter "Model-view-controller".

Aktualisieren : Das falsche Wort "the" wurde gelöscht.

    
Jim DeLaHunt 19.12.2012 02:01
quelle
4

Sie finden die Nummerierungssysteme in CLDR . Die id -Attribute-Beschreibungen finden Sie in der bcp-Datei für Zahlen . Ein Nummerierungssystem ist entweder numeric oder algorithimic , angegeben im type -Attribut. Wenn es "numeric" ist, enthält das digits -Attribut Ziffern in diesem System beginnend mit 0. Wenn es "algorithmic" ist, dann bezieht sich das rules -Attribut auf die verwendeten Regeln. Lesen von Nummerierungssystemdateien

Die algorithmischen Regeln für Nummerierungssysteme finden Sie in der Datei root.xml in rbnf ( Regelbasierte Zahlenformatierung) . Weitere Informationen zum Lesen von rbnf-Dateien .

Die ICU-Bibliotheken implementieren dies bereits, aber Sie können auch Ihre eigenen basierend auf den Daten von oben rollen Links, um von irgendwelchen Nummerierungszeichen in Ganzzahlen oder umgekehrt umzuwandeln.

    
Esailija 16.12.2012 10:36
quelle
1

Unicode schreibt keine Zeichen für Zeichen vor. Ein Charakter gilt als Abstraktion, unabhängig von einer spezifischen Formgebung. In gewisser Hinsicht sind also alle Charaktere "unabhängig vom Aussehen".

Aber um zu Ihrer Frage zu kommen (ich denke), würde diese Art der Lokalisierung eine Sequenz von Codepunkten erfordern, die eine Zahl darstellen, die zuerst identifiziert und in eine tatsächliche Zahl umgewandelt wird. Ich denke, dass keine Unicode-Veröffentlichung beschreibt, wie dies zu tun ist (sogar UTR 25 nimmt lateinische Ziffern an), und es wird nicht notwendigerweise gehen sei einfach. Wie bereits erwähnt, haben einige Codepunkte Werte außerhalb des Bereichs von 0 bis 9, und Zahlen können von links nach rechts in ansonsten von rechts nach links umgebendem Text erscheinen.

Angenommen, Sie möchten dies versuchen, benötigen Sie jedoch Numeric Type und Numeric Value jedes Codepunkts; Dies sind normative Eigenschaften, deren Werte in UnicodeData.txt aufgelistet sind . Sie definieren den abstrakten Wert für jeden Codepunkt, der eine Zahl darstellt (eine Zahl, die nicht notwendigerweise eine Ziffer oder ein Sinn ist). Sobald Sie die abstrakte Zahl haben, müssen Sie den umgekehrten Prozess ausführen, indem Sie sie in eine länderspezifische Codepunktsequenz konvertieren, die den gleichen Wert darstellt.

    
Nathan Ryan 25.12.2012 01:16
quelle