2015-11-15 9 views
6

Czy znaki arabskie mają różne punkty kodu Unicode w zależności od pozycji w łańcuchu lub czy jest to rozwiązanie wizualne?Czy znaki arabskie mają różne punkty kodu Unicode na podstawie pozycji w łańcuchu znaków?

To jest to samo słowo, 3 razy, z białymi spacjami i bez wygląda na to, że ma tę samą wartość Unicode.

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

Co muszę zrobić, to zeskanować listę ciągów arabskimi i uzyskać ich wartości. Używając tych wartości, wybiorę ikonę konkretnej litery do wyświetlenia. Jednak jeśli jest to ten sam kod, znaczenie jest takie, że muszę utworzyć w kodzie własną logikę, której chcę uniknąć.

+3

Proszę przeczytać wpis w Wikipedii po arabsku w Unicode. Odpowiedź brzmi: być może. Pojedyncze kształty mogą być renderowane inaczej przez silniki renderujące tekst i/lub instrukcje OpenType w samym pliku czcionki. – usr2564301

+1

Odpowiedź brzmi "tak". W piśmie arabskim litery zmieniają kształt w zależności od otaczających liter. Różne kształty litery są reprezentowane przez ten sam punkt kodowy. – roeland

+0

@roeland: Z wyjątkiem tego, że nie jest to takie proste, ponieważ Unicode udostępnia również punkty kodu dla initil, środkowych i końcowych form liter. – Flimm

Odpowiedz

19

Różne kształty mają różne unicode, na przykład list ت \u062A posiada wszystkie te kody dla różnych kształtach: \uFE95 ت, \uFE97 ت, \uFE98 ت, \uFE96 Ę.

Chociaż większość tekstów w języku arabskim jest przechowywana z głównym nieukształtowanym unikodem. formy w kształcie są używane tylko w renderingu. więc jeśli sprawdzisz swój tekst za pomocą programu, znajdziesz go w większości bez kształtu.

Jeśli chcesz wszystkie litery kształcie, można korzystać z biblioteki Reshaper jak: Python Arabic Reshaper:

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

Jeśli chcesz wszystkie litery unshaped, korzystać z mapy, kształtującą się do konwersji listy do swojej głównej postaci.

Tutaj znajduje się mapa kształtowanie:

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

Czy w JAVA jest jakikolwiek arabski rehaper? – Mneckoee

+1

@Mneckoee sprawdź to https://github.com/agawish/Better-Arabic-Reshaper –

+0

Co powiecie na arabski rehaper w C#? – Mneckoee

3

arabski ma 5 bloków znaków zastrzeżonych dla niego w Unicode:

  • U + 0600 .. U + 06FF arabskie
  • U + 0750 .. U + 077F arabski dodatek
  • U + 08A0 .. U + 08FF Arabski rozszerzony A
  • U + FB50 .. U + FDFF arabski Pre Formularze wysyłkowe A
  • U + FE70 ..U + FEFF arabska Przedstawienie formy B

Przykład tekst pytania są wszystkie zakodowane zgodnie z punktami kod 4:

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

Dodatkowo, istnieją przestrzenie i niektóre występujące:

  • UTF-8 0xE2 0x80 0x8E = U + 200E = lewy-prawy znacznik (LRM)

Fakt, że arabska litery są wyświetlane inaczej, mimo że ten sam kod Unicode służący do przechowywania danych pokazuje, że będziesz musiał dostosować glif wyświetlany na jego pozycji względem innych znaków (początek, środek, koniec słowa lub tryb samodzielny). Możesz przeczytać Rozdział 9 (Middle East–I), aby dowiedzieć się więcej na temat obsługi tekstu w języku arabskim.

Powiązane problemy