2015-11-15 22 views
6

Các ký tự tiếng Ả Rập có các điểm mã Unicode khác nhau dựa trên vị trí trong chuỗi hay là giải pháp trực quan?Các ký tự tiếng Ả Rập có các điểm mã Unicode khác nhau dựa trên vị trí trong chuỗi không?

Đây là cùng một từ, 3 lần, có khoảng trắng và không có có vẻ giống như giá trị Unicode giống nhau.

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

gì tôi cần phải làm, là để quét một danh sách các chuỗi tiếng Ả Rập, và nhận được giá trị của họ. Sử dụng những giá trị đó, tôi sẽ chọn biểu tượng của chữ cái cụ thể để hiển thị. Tuy nhiên, nếu đó là cùng một điểm mã, ý nghĩa là tôi cần phải tạo ra một logic của riêng tôi trong mã, mà tôi muốn tránh.

+3

Vui lòng đọc mục nhập Wikipedia bằng tiếng Ả Rập trong Unicode. Câu trả lời là: có thể. Hình dạng riêng biệt có thể được hiển thị khác nhau bằng công cụ hiển thị văn bản và/hoặc theo hướng dẫn OpenType trong chính tệp phông chữ. – usr2564301

+1

Câu trả lời là "có". Trong kịch bản tiếng Ả Rập các chữ cái thay đổi hình dạng tùy thuộc vào các chữ cái xung quanh. Và các hình dạng khác nhau của một chữ cái được thể hiện bằng cùng một điểm mã. – roeland

+0

@roeland: Ngoại trừ việc nó không đơn giản, bởi vì Unicode cũng cung cấp các điểm mã cho các dạng chữ cái đầu tiên, giữa và cuối cùng của các chữ cái. – Flimm

Trả lời

19

hình dạng khác nhau có unicode khác nhau, ví dụ như thư ت \u062A có tất cả những mã cho hình dạng khác nhau: \uFE95 ت, \uFE97 ت, \uFE98 ت, \uFE96 ت.

Mặc dù, chủ yếu, văn bản tiếng Ả Rập được giữ với unicode unshaped chính. hình dạng hình được sử dụng chỉ trong rendering. vì vậy nếu bạn kiểm tra văn bản của bạn thông qua một chương trình, bạn sẽ thấy nó hầu như không bị định hình.

Nếu bạn muốn tất cả các chữ có hình dạng, bạn có thể sử dụng một thư viện reshaper như: Python Arabic Reshaper:

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

Nếu bạn muốn tất cả các chữ unshaped, sử dụng bản đồ hình xuống để chuyển đổi chữ để hình chính của họ.

Dưới đây là một bản đồ hình:

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

Có bất kỳ trình chỉnh sửa tiếng Ả Rập nào trong JAVA không? – Mneckoee

+1

@Mneckoee kiểm tra https://github.com/agawish/Better-Arabic-Reshaper –

+0

Làm thế nào về trình chỉnh sửa tiếng Ả Rập trong C#? – Mneckoee

3

tiếng Ả Rập có 5 khối ký tự dành riêng cho nó trong Unicode:

  • U + 0600 .. U + 06FF Ả Rập
  • U + 0750 .. U + 077F Bổ sung tiếng Ả Rập
  • U + 08A0 .. U + 08FF Arabic Mở rộng A
  • U + FB50 .. U + FDFF Arabic Pre Biểu mẫu gửi đi A
  • U + FE70 ..U + FEFF Ả Rập Presentation Forms B

Ví dụ văn bản trong câu hỏi là tất cả mã hóa với các điểm 4 mã:

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

Bên cạnh đó, có không gian và một số lần xuất hiện của:

  • UTF-8 0xE2 0x80 0x8E = U + 200E = LEFT sang phải MARK (LRM)

Thực tế là tiếng Ả Rập các chữ cái được hiển thị khác nhau mặc dù cùng một điểm mã Unicode được sử dụng để lưu trữ dữ liệu cho thấy bạn sẽ cần điều chỉnh glyph được hiển thị với vị trí của nó so với các ký tự khác (bắt đầu, giữa, cuối từ hoặc độc lập). Bạn có thể đọc Chương 9 (Middle East–I) để tìm hiểu thêm về cách xử lý văn bản tiếng Ả Rập.

Các vấn đề liên quan