2013-04-13 24 views
5

Các Unicode Normalization FAQ bao gồm các khoản sau đây:Khi nào nên sử dụng các hình thức chuẩn hóa Unicode NFC và NFD?

Các chương trình cần luôn luôn so sánh chuỗi Unicode kinh điển tương đương như bằng ... Tiêu chuẩn Unicode cung cấp hình thức bình thường cũng xác định rằng có thể được sử dụng cho việc này: NFC và NFD.

và tiếp tục ...

Sự lựa chọn trong số đó sử dụng phụ thuộc vào chương trình hoặc hệ thống cụ thể. NFC là dạng tốt nhất cho văn bản chung, vì nó tương thích hơn với các chuỗi được chuyển đổi từ mã hóa kế thừa. ... NFD và NFKD là hữu ích nhất để xử lý nội bộ.

Câu hỏi của tôi là:

Điều gì làm cho NFC tốt nhất cho "văn bản nói chung." Điều gì định nghĩa "xử lý nội bộ" và tại sao nó tốt nhất còn lại cho NFD? Và cuối cùng, đừng bao giờ để ý cái gì là "tốt nhất", là hai hình thức hoán đổi cho nhau chừng nào hai chuỗi được so sánh bằng cách sử dụng cùng một hình thức bình thường?

+0

«NFC là hình thức tốt nhất cho văn bản chung, vì nó tương thích hơn với các chuỗi được chuyển đổi từ mã hóa cũ. ... NFD và NFKD là hữu ích nhất để xử lý nội bộ. »Là một số câu lệnh không có thật. Mặc dù các chuỗi kế thừa có thể ở dạng mà khi được chuyển thành Unicode ở dạng NFC, để bảo trì trong tương lai (mã luôn được sử dụng trong điều kiện không lường trước được), bạn sẽ tốt hơn nếu bạn chuyển đổi sang NF [CD] một cách rõ ràng. – ninjalj

Trả lời

1
  1. NFC là hình thức cảm giác chung chung mà bạn nên sử dụng, ä là 1 điểm mã đó và có ý nghĩa.

  2. NFD là tốt cho xử lý nội bộ nhất định - nếu bạn muốn thực hiện tìm kiếm hoặc phân loại không nhạy cảm, việc chuỗi của bạn trong NFD giúp bạn dễ dàng hơn và nhanh hơn nhiều. Một cách sử dụng khác là tạo ra những tiêu đề mạnh mẽ hơn. Đây chỉ là những điều hiển nhiên nhất, tôi chắc chắn có nhiều công dụng hơn.

  3. Nếu hai chuỗi x và y là tương đương kinh điển, sau đó
    toNFC (x) = toNFC (y)
    toNFD (x) = toNFD (y)

    Là những gì bạn nghĩa là gì?

+1

Re 3, tôi không nghĩ đó luôn là trường hợp. Ví dụ. (từ Wikipedia) chuỗi 1 chứa "U + 212B" (dấu hiệu angstrom "Å"), chuỗi 2 chứa "U + 0041 U + 030A" (chữ cái Latinh "A" và kết hợp vòng ở trên "°"). Theo NFD, chúng tương đương nhau, nhưng theo chuỗi NFC 2 được chuyển thành "U + 00C5" (chữ Thụy Điển "Å"), vì vậy hai chữ cái không tương đương. Dường như với tôi rằng NFD là sự lựa chọn an toàn nhất. http://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms – Aurimas

+0

@Aurimas từ trang web unicode http://www.unicode.org/reports/tr15/tr15-18.html – Esailija

+0

Bạn hoàn toàn đúng, tôi đã sắp thay đổi nhận xét của tôi sau khi đọc thêm về vấn đề này. Chìa khóa ở đây là để chuyển sang NFC, trước tiên bạn chuyển đổi sang NFD. – Aurimas

6

Câu hỏi thường gặp có phần gây hiểu lầm, bắt đầu từ việc sử dụng “cần”, sau đó sử dụng “yêu cầu” không nhất quán về cùng một điều. Bản thân chuẩn Unicode (được trích dẫn trong FAQ) chính xác hơn. Về cơ bản, bạn không nên mong đợi các chương trình xử lý các chuỗi tương đương về mặt kinh điển là khác nhau, nhưng bạn cũng không nên mong đợi tất cả các chương trình xử lý chúng giống hệt nhau.

Trong thực tế, nó thực sự phụ thuộc vào những gì phần mềm của bạn cần làm. Trong hầu hết các trường hợp, bạn không cần bình thường hóa và việc chuẩn hóa có thể phá hủy thông tin cần thiết trong dữ liệu.

Ví dụ: U + 0387 GREEK ANO TELEIA (·) được định nghĩa là tương đương chuẩn với U + 00B7 MIDDLE DOT (·). Đây là một sai lầm, vì các ký tự thực sự khác biệt và phải được hiển thị khác và xử lý khác nhau trong quá trình xử lý. Nhưng đã quá muộn để thay đổi điều đó, vì phần Unicode này đã được khắc vào đá. Do đó, nếu bạn chuyển đổi dữ liệu sang NFC hoặc loại bỏ sự khác biệt giữa các chuỗi tương đương về mặt kinh điển, bạn có thể gặp phải các ký tự sai.

Có những rủi ro mà bạn thực hiện bằng cách không phải bình thường hóa.Ví dụ, chữ “ä” có thể xuất hiện dưới dạng một ký tự Unicode đơn U + 00E4 LATIN NHỎ THƯ LẠI A WITH DIAERESIS hoặc dưới dạng hai ký tự Unicode U + 0061 LATIN NHỎ LỌC A U + 0308 COMAINESIS DIAERESIS. Nó sẽ chủ yếu là dạng cũ, tức là dạng precomposed, nhưng nếu nó là phần sau và mã của bạn kiểm tra dữ liệu chứa “ä”, chỉ sử dụng dạng precomposed, sau đó nó sẽ không phát hiện ra cái sau. Nhưng trong nhiều trường hợp, bạn không làm những việc như vậy nhưng chỉ lưu trữ dữ liệu, nối chuỗi, in chúng, v.v. Sau đó, có một rủi ro là hai biểu diễn này dẫn đến kết quả hiển thị hơi khác nhau.

Điều quan trọng là liệu phần mềm của bạn có chuyển dữ liệu ký tự sang phần mềm khác không. Người nhận có thể mong đợi, do các giả định tiềm ẩn ngây thơ hoặc có ý thức và theo cách được ghi nhận tài liệu, đầu vào của nó được chuẩn hóa.

+1

Một nơi mà 'U + 0061 LATIN SMALL LETTER A U + 0308 COMBINING DIAERESIS' sẽ là cách diễn tả“ ä ”sẽ là tên tập tin Max OS X, đòi hỏi một phiên bản cụ thể của NFD. – hippietrail

+0

@hippietrail là tài liệu ở đâu đó? – Keith4G

+1

@ Keith4G: Cần có câu hỏi về nó trên SO. Hãy để tôi có một cái nhìn cho bạn. Tôi không phải là một anh chàng Mac nhưng nhiều năm trước đã làm một số công cụ để đọc phân vùng Mac cho vui và chạy vào này. – hippietrail

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