2015-11-15 2 views
6

Haben arabische Zeichen unterschiedliche Unicode-Codepunkte basierend auf der Position in einer Zeichenfolge oder ist dies eine visuelle Lösung?Haben arabische Zeichen unterschiedliche Unicode-Codepunkte basierend auf der Position in der Zeichenfolge?

Dies ist das gleiche Wort, 3 Mal, mit Leerzeichen und ohne scheint es, dass es der gleiche Unicode-Wert ist.

عربى
عرب ى
ع ربى

Was ich tun muss, ist, eine Liste von arabischen Strings zu scannen, und ihre Werte zu erhalten. Mit diesen Werten wähle ich das Symbol des anzuzeigenden Buchstabens aus. Wenn es jedoch derselbe Codepunkt ist, bedeutet das, dass ich eine eigene Logik im Code erstellen muss, die ich vermeiden möchte.

+3

Bitte lesen Sie den Wikipedia-Eintrag auf Arabisch in Unicode. Die Antwort ist: möglicherweise. Isolierte Formen können durch Text-Rendering-Engines und/oder OpenType-Anweisungen in der Schriftartdatei selbst unterschiedlich dargestellt werden. – usr2564301

+1

Die Antwort ist "Ja". In arabischer Schrift ändern sich die Buchstaben abhängig von den umgebenden Buchstaben. Und die verschiedenen Formen eines Buchstabens werden durch den gleichen Codepunkt dargestellt. – roeland

+0

@roeland: Außer es ist nicht so einfach, weil Unicode auch Codepunkte für Initial-, Mittel- und Endform von Buchstaben zur Verfügung stellt. – Flimm

Antwort

19

Verschiedene Formen haben unterschiedliche Unicode, zum Beispiel der Brief ت \u062A diese Codes alle für verschiedene Formen hat: \uFE95 ت, \uFE97 ت, \uFE98 ت, \uFE96 ت.

Obwohl hauptsächlich arabische Texte mit dem wichtigsten ungeformten Unicode beibehalten werden. Formen werden nur beim Rendern verwendet. Wenn Sie also Ihren Text durch ein Programm überprüfen, werden Sie ihn meist ungeformt finden.

Wenn Sie alle Buchstaben geformt wollen, können Sie eine Reshaper Bibliothek wie verwenden: Python Arabic Reshaper:

import arabic_reshaper 
    reshaped_text = arabic_reshaper.reshape(u'اللغة العربية رائعة') 

Wenn Sie alle Buchstaben ungeformten wollen, die Gestaltung der Karte verwenden unten Briefe an ihre Haupt Form zu konvertieren.

Hier ist eine Form Karte:

SHAPING = { 
u'\u0621' : (u'\uFE80') , 
u'\u0622' : (u'\uFE81', u'\uFE82') , 
u'\u0623' : (u'\uFE83', u'\uFE84') , 
u'\u0624' : (u'\uFE85' , u'\uFE86') , 
u'\u0625' : (u'\uFE87' , u'\uFE88') , 
u'\u0626' : (u'\uFE89' , u'\uFE8B' , u'\uFE8C' , u'\uFE8A') , 
u'\u0627' : (u'\uFE8D' , u'\uFE8E') , 
u'\u0628' : (u'\uFE8F' , u'\uFE91' , u'\uFE92' , u'\uFE90') , 
u'\u0629' : (u'\uFE93' , u'\uFE94') , 
u'\u062A' : (u'\uFE95' , u'\uFE97' , u'\uFE98' , u'\uFE96') , 
u'\u062B' : (u'\uFE99' , u'\uFE9B' , u'\uFE9C' , u'\uFE9A') , 
u'\u062C' : (u'\uFE9D' , u'\uFE9F' , u'\uFEA0', u'\uFE9E') , 
u'\u062D' : (u'\uFEA1' , u'\uFEA3' , u'\uFEA4' , u'\uFEA2') , 
u'\u062E' : (u'\uFEA5' , u'\uFEA7' , u'\uFEA8' , u'\uFEA6') , 
u'\u062F' : (u'\uFEA9' , u'\uFEAA') , 
u'\u0630' : (u'\uFEAB' , u'\uFEAC') , 
u'\u0631' : (u'\uFEAD' , u'\uFEAE') , 
u'\u0632' : (u'\uFEAF' , u'\uFEB0') , 
u'\u0633' : (u'\uFEB1' , u'\uFEB3' , u'\uFEB4' , u'\uFEB2') , 
u'\u0634' : (u'\uFEB5' , u'\uFEB7' , u'\uFEB8' , u'\uFEB6') , 
u'\u0635' : (u'\uFEB9' , u'\uFEBB' , u'\uFEBC' , u'\uFEBA') , 
u'\u0636' : (u'\uFEBD' , u'\uFEBF' , u'\uFEC0' , u'\uFEBE') , 
u'\u0637' : (u'\uFEC1' , u'\uFEC3' , u'\uFEC4' , u'\uFEC2') , 
u'\u0638' : (u'\uFEC5' , u'\uFEC7' , u'\uFEC8' , u'\uFEC6') , 
u'\u0639' : (u'\uFEC9' , u'\uFECB' , u'\uFECC' , u'\uFECA') , 
u'\u063A' : (u'\uFECD' , u'\uFECF' , u'\uFED0', u'\uFECE') , 
u'\u0640' : (u'\u0640') , 
u'\u0641' : (u'\uFED1' , u'\uFED3' , u'\uFED4' , u'\uFED2') , 
u'\u0642' : (u'\uFED5' , u'\uFED7' , u'\uFED8' , u'\uFED6') , 
u'\u0643' : (u'\uFED9' , u'\uFEDB' , u'\uFEDC' , u'\uFEDA') , 
u'\u0644' : (u'\uFEDD' , u'\uFEDF' , u'\uFEE0', u'\uFEDE') , 
u'\u0645' : (u'\uFEE1' , u'\uFEE3' , u'\uFEE4' , u'\uFEE2') , 
u'\u0646' : (u'\uFEE5' , u'\uFEE7' , u'\uFEE8' , u'\uFEE6') , 
u'\u0647' : (u'\uFEE9' , u'\uFEEB' , u'\uFEEC' , u'\uFEEA') , 
u'\u0648' : (u'\uFEED' , u'\uFEEE') , 
u'\u0649' : (u'\uFEEF' , u'\uFEF0') , 
u'\u064A' : (u'\uFEF1' , u'\uFEF3' , u'\uFEF4' , u'\uFEF2') 
} 
+0

Gibt es in JAVA einen arabischen Umformer? – Mneckoee

+1

@Mneckoe Überprüfen Sie diese https://github.com/agawish/Better-Arabic-Reshaper –

+0

Wie wäre es mit arabischen Umformer in C#? – Mneckoee

3

Arabisch hat 5 Blöcke für sie in Unicode reservierte Zeichen:

  • U + 0600 .. U + 06FF Arabisch
  • U + 0750 .. U + 077F Arabischer Nachtrag
  • U + 08A0 .. U + 08FF Arabisch Erweitert A
  • U + FB50 .. U + FDFF Arabisch Pre Senden Forms A
  • U + FE70 ..U + FEFF Arabische Präsentationsformen B

der Beispieltext in der Frage ist, die alle mit den 4 Codepunkten ausgewertet:

  • UTF-8 0xD8 0xB9 = U + 0639 = ARABISCHER LETTER AIN
  • UTF-8 0xD8 0xB1 = U + 0631 = ARABISCHER LETTER REH
  • UTF-8 0xD8 0xA8 = U + 0628 = ARABISCHER LETTER BEH
  • UTF-8 0xD9 0x89 = U + 0649 = ARABISCHER LETTER ALEF MAKSURA

Darüber hinaus gibt es Räume und einige Vorkommen von:

  • UTF-8 0xE2 0x80 0x8E = U + 200E = links nach rechts MARK (LRM)

Die Tatsache, dass die arabische Buchstaben werden unterschiedlich angezeigt, obwohl derselbe Unicode-Codepunkt für die Speicherung der Daten verwendet wird. Dies zeigt, dass Sie die angezeigte Glyphe relativ zu anderen Zeichen (Anfang, Mitte, Ende des Wortes oder Standalone) anpassen müssen. Sie können Kapitel 9 (Middle East–I) lesen, um mehr über die Handhabung von arabischem Text zu erfahren.

Verwandte Themen