2010-03-14 43 views
15

Lớp Character trong Java xác định các phương pháp kiểm tra đối số char nhất định cho sự bình đẳng với các ký tự Unicode nhất định hoặc thuộc về một số loại danh mục. Các loại ký tự và loại được đặt tên.Java: Cách lấy tên Unicode của một ký tự (hoặc loại thể loại của nó)?

Như đã nêu trong javadoc đã cho, ví dụ về ký tự được đặt tên là
HORIZONTAL TABULATION, FORM FEED, ...;
ví dụ cho loại kiểu đặt tên là
SPACE_SEPARATOR, PARAGRAPH_SEPARATOR ...

Tuy nhiên, là byte hoặc int giá trị thay vì enums, tên của các loại là "ẩn" khi chạy.

Vì vậy, có khả năng nhận tên của nhân vật và/hoặc nhập danh mục khi chạy không?

Trả lời

13

JDK7 sẽ có một hàm

String getName(int codepoint) 

(ĐỌC: một “phương pháp tĩnh” trong lớp java.lang.Character) sẽ biến một điểm mã thành tên chính thức của nó Unicode.

Javadoc: http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#getName%28int%29

+1

Dường như đó là JDK7; http://download.java.net/jdk7/docs/api/java/lang/Character.html#getName%28int%29 –

+0

Làm thế nào để bạn nhận được codepoint từ một ký tự unicode? –

9

Có. Sử dụng thư viện ICU4J. Nó có một toàn bộ UCD và một API để đưa mọi thứ ra khỏi nó.

2

Lớp Character hỗ trợ thông tin danh mục. Hãy xem Character.getType(char) cho danh mục. Nhưng tôi không nghĩ, bạn có thể có được tên nhân vật.

1

Tên là standard và có thể được sử dụng theo một số nhất định limitations.

+3

Ồ không, bản quyền ... Tôi hy vọng sẽ không có thời gian khi mọi người không thể nói mà không chấp nhận giấy phép bản quyền "Unitalk" .. –

+1

Không có giới hạn về việc sử dụng các tên này trong bối cảnh này. UTC rất vui khi có ai sử dụng chúng trong trường hợp này. – bmargulies

+0

IIUC, các điều khoản được quy định tại Phụ lục 1 (a) (b) (c), được trích dẫn ở trên. – trashgod

1

tôi đăng một thực hiện NET ở đây: Finding out Unicode character name in .Net

Điều đó sẽ rất dễ dàng để cổng cho Java. Tất cả những gì bạn cần là tải xuống Cơ sở dữ liệu Unicode: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt và tương đương Java của một phương thức tách chuỗi và một lớp Từ điển, cả hai đều chắc chắn tồn tại trong Java.

Đây là một lựa chọn đơn giản để tải xuống một số thư viện cồng kềnh với hàng tấn các phương thức Unicode mà Java và .NET có thể đã hỗ trợ.

0

Đối với tên nhân vật, người ta có thể sử dụng Character.getName(int). Tuy nhiên, đối với danh mục chung, nó không thuận tiện như vậy:

// attach String names to Character constants 
Map<Byte, String> unicodeCategories = new HashMap<>(); 
unicodeCategories.put(Character.COMBINING_SPACING_MARK, "Mc"); 
unicodeCategories.put(Character.CONNECTOR_PUNCTUATION, "Pc"); 
unicodeCategories.put(Character.CONTROL, "Cc"); 
unicodeCategories.put(Character.CURRENCY_SYMBOL, "Sc"); 
unicodeCategories.put(Character.DASH_PUNCTUATION, "Pd"); 
unicodeCategories.put(Character.DECIMAL_DIGIT_NUMBER, "Nd"); 
unicodeCategories.put(Character.ENCLOSING_MARK, "Me"); 
unicodeCategories.put(Character.END_PUNCTUATION, "Pe"); 
unicodeCategories.put(Character.FINAL_QUOTE_PUNCTUATION, "Pf"); 
unicodeCategories.put(Character.FORMAT, "Cf"); 
unicodeCategories.put(Character.INITIAL_QUOTE_PUNCTUATION, "Pi"); 
unicodeCategories.put(Character.LETTER_NUMBER, "Nl"); 
unicodeCategories.put(Character.LINE_SEPARATOR, "Zl"); 
unicodeCategories.put(Character.LOWERCASE_LETTER, "Ll"); 
unicodeCategories.put(Character.MATH_SYMBOL, "Sm"); 
unicodeCategories.put(Character.MODIFIER_LETTER, "Lm"); 
unicodeCategories.put(Character.MODIFIER_SYMBOL, "Sk"); 
unicodeCategories.put(Character.NON_SPACING_MARK, "Mn"); 
unicodeCategories.put(Character.OTHER_LETTER, "Lo"); 
unicodeCategories.put(Character.OTHER_NUMBER, "No"); 
unicodeCategories.put(Character.OTHER_PUNCTUATION, "Po"); 
unicodeCategories.put(Character.OTHER_SYMBOL, "So"); 
unicodeCategories.put(Character.PARAGRAPH_SEPARATOR, "Zp"); 
unicodeCategories.put(Character.PRIVATE_USE, "Co"); 
unicodeCategories.put(Character.SPACE_SEPARATOR, "Zs"); 
unicodeCategories.put(Character.START_PUNCTUATION, "Ps"); 
unicodeCategories.put(Character.SURROGATE, "Cs"); 
unicodeCategories.put(Character.TITLECASE_LETTER, "Lt"); 
unicodeCategories.put(Character.UNASSIGNED, "Cn"); 
unicodeCategories.put(Character.UPPERCASE_LETTER, "Lu"); 
// use the map to extract category name from the constant 
char ch = 'a'; // OR int ch = Character.codePointAt("a", 0); 
String category = unicodeCategories.get((byte) (Character.getType(ch))); 
Các vấn đề liên quan