2012-12-19 38 views
8

nhìn vào đoạn mã sau:Python unicode bình thường: là nó đúng để dịch u ' xb4' u' u0301'

>>> import unicodedata 
>>> from unicodedata import normalize, name 

>>> normalize('NFKD', u'\xb4') 
u' \u0301' 

>>> normalize('NFKD', u'a\xb4a') 
u'a \u0301a' 

>>> normalize('NFKC', u'a\xb4a') 
u'a \u0301a' 

>>> name(u'\xb4'), name(u'\u0301') 
('ACUTE ACCENT', 'COMBINING ACUTE ACCENT') 

Tôi cố gắng để hiểu được nếu hành vi đó để dịch u'\xb4'-u' \u0301' là chính xác. Tại sao nó pad kết hợp giọng cấp tính với một không gian? Tại sao nó dịch u \xb4?

Tại fileformat chúng tôi thấy rằng ACUTE ACCENT từng được gọi là SPACING ACUTE. Tôi nghĩ, nó chỉ có nghĩa là con trỏ sẽ di chuyển thay vì đợi ký tự sau được nhập vào.

UPD: trong trường hợp ai đó quan tâm, đây là danh sách nếu các ký tự unicode sau khi chuẩn hóa NFKC có khoảng trắng phần đầu: http://pastebin.com/Z99r5AK9

Trả lời

11

một nhân vật giọng là sự kết hợp của một không gian và một nhân vật giọng kết hợp, theo quy định trong tiêu chuẩn Unicode:

>>> import unicodedata 
>>> unicodedata.decomposition(u'\xb4') 
'<compat> 0020 0301' 

Nhân vật \u00B4 có một lịch sử khá mơ hồ, nhưng tiêu chuẩn Unicode đã quyết định coi nó là khoảng trắng + giọng, mặc dù nó có thường là được sử dụng làm dấu chỉ dấu, xem this discussion.

Bạn có thể sử dụng \u02CA làm phương án thay thế; nó không được coi là khoảng trắng, và không có sự phân hủy nào được chỉ định. Thay vào đó, nó đủ điều kiện làm thư, vì vậy số dặm của bạn có thể thay đổi.

+0

rất thú vị, cảm ơn bạn! – newtover

+0

U + 00B4 ACCUTE ACCENT và U + 02CA MODIFIER LETTER ACUTE ACCENT là các ký tự riêng biệt và không được mong đợi là “được hiển thị giống nhau”. Cái cũ thường xuất hiện nhiều hơn trong các phông chữ. Khi cả hai đều có mặt, chúng thường trông giống nhau hoặc giống nhau, nhưng chúng có các thuộc tính khác nhau được xác định trong Tiêu chuẩn Unicode (ví dụ: Biểu tượng danh mục chung, Công cụ sửa đổi so với Thư, Công cụ sửa đổi). Và, ví dụ, trong phông chữ Doulos SIL, glyphs của chúng dường như giống hệt nhau nhưng độ rộng trước là khác nhau; và ở MingLiU, các sườn dốc rất khác nhau. –

+0

@ JukkaK.Korpela: Tôi đã sửa chữa; Tôi phải hiểu lầm bối cảnh, tôi sẽ loại bỏ phần đó. –

4

Hãy xem tài liệu Unicode Collation Algorithm. Đặc biệt, lưu ý rằng

Tính tương thích tương thích (NFKC) gấp dấu riêng biệt với dấu cách kết hợp không gian + kết hợp dấu.

+0

Tôi nên tìm kiếm tốt hơn, cảm ơn bạn! – newtover

3

Trong NFKD, ký tự có dấu được lưu trữ trong một "phân chia" cách: thứ nhất nhân vật được có dấu và sau đó là giọng kết hợp: u' \u0301'

Trong NFKC, ký tự có dấu được lưu trữ theo một cách "kết hợp" : có một điểm mã Unicode chuyên dụng: u'\xb4', viết tắt là u'\u00b4'.

Cả hai chỉ đại diện cho giọng một mình, có thể được coi là dấu trọng âm trên ký tự khoảng trắng.

+0

cảm ơn bạn, tất cả các câu trả lời rất hữu ích – newtover

+1

nó cũng là thú vị tại sao 'normalize ('NFKC', u '\ u0301')' không trả về 'u '\ xb4''. – newtover

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