2011-08-24 45 views
18

Trong suốt số lượng ký tự unicode lớn, có một số ký tự đại diện cho nhiều hơn một ký tự, giống như hình chữ U + FB00 ff cho hai ký tự 'f'. Có cách nào dễ dàng để chuyển đổi các ký tự như thế này thành nhiều ký tự đơn không? Tốt hơn là một cái gì đó có sẵn trong Java API tiêu chuẩn, nhưng tôi có thể tham khảo một thư viện bên ngoài nếu cần thiết.Tách các ký tự ligature Unicode

+1

Tôi đã tự do thêm từ khóa * ligature * vào câu hỏi của bạn. :) – deceze

+0

Cảm ơn - Tôi không chắc họ đã gọi gì. :-) – nonoitall

+1

không phải đồ thị cho đơn vị cơ bản? –

Trả lời

19

U + FB00 là ký tự tương thích. Thông thường Unicode không hỗ trợ các điểm mã riêng biệt cho các chữ ligatures (cho rằng đó là quyết định bố trí nếu và khi sử dụng một kết nối và không nên ảnh hưởng đến cách dữ liệu được lưu trữ). Một số vài của những thứ vẫn còn tồn tại để cho phép khả năng tương thích chuyển đổi khứ hồi với các mã hóa cũ hơn mà làm đại diện cho các chữ lig như các thực thể riêng biệt.

May mắn thay, thông tin có ký tự đại diện cho có trong Unicode data file và các hệ thống xử lý chuỗi có khả năng nhất có dữ liệu được tích hợp sẵn.

Trong Java, bạn sẽ cần phải sử dụng the Normalizer classNFKC dạng:

String ff ="\uFB00"; 
String normalized = Normalizer.normalize(ff, Form.NFKC); 
System.out.println(ff + " = " + normalized); 

này sẽ in

ff = ff
+0

Tuyệt vời! Cảm ơn! – nonoitall

+4

@nonoitall: NFKD không phải là thuốc chữa bách bệnh: có rất nhiều ligatures và các hình thức kết hợp notionally khác ** nó chỉ không hoạt động chút nào. ** Ví dụ, nó sẽ không quản lý để phân hủy * ß * hoặc * ẞ * thành * SS * (ngay cả những cái đó cũng có dạng gấp!), Cũng không * Æ * thành * AE * hoặc * æ * thành * ae *, cũng không * Œ * thành * OE * hoặc * œ * thành * oe *. Nó cũng vô ích khi chuyển * ð * hoặc * đ * thành * d * hoặc * ø * thành * o *. Đối với ** tất cả ** những điều đó, bạn cần UCA (Unicode Collation Algorithm), ** not ** NFKD. NFD/NFKD cũng có cả tài sản gây phiền nhiễu phá hủy những người độc thân, nếu điều này quan trọng với bạn. – tchrist

+5

@ tchrist: sự hiểu biết của tôi là những phân tích mà bạn đề cập * nên * không được thực hiện. Chúng không chỉ đơn giản là chữ ghép trong ý nghĩa đánh máy, mà là các ký tự riêng biệt thực sự được sử dụng khác nhau! ß * có thể * được phân tách thành ss nếu cần thiết (ví dụ: nếu bạn chỉ có thể lưu trữ ASCII), nhưng chúng không ** tương đương. Mặt khác, mặt dây ff là * chỉ * một dây chằng. –

1

Bạn có thể thử các java.text.Normalizer, nhưng tôi không thực sự chắc chắn nếu điều đó làm việc cho ligatures.

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/18866472) – pirho

4

Quá trình bạn đang nói về được gọi là Normalization và được quy định trong Unicode Normalization Forms lưu ý kỹ thuật.

Có một lớp trong thư viện lớp Java SE có tên là java.text.Normalizer thực hiện quy trình này. Tuy nhiên, bạn cần phải đọc tài liệu Unicode được liên kết ở trên để tìm hiểu xem "biểu mẫu bình thường" nào bạn cần sử dụng để có được kết quả mong muốn. Nó không phải là đơn giản ....

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