2009-08-26 15 views
14

câu hỏi đầu tiên của tôi ở đây :-)
Đọc tốt nhất các quy tắc và tìm kiếm nếu câu hỏi đã được hỏi trước đó.Java equalsIgnoreCase không thành công với ß ("Sharp S" được sử dụng trong bảng chữ cái tiếng Đức)

Các mã sau

String[] strings = {"cAsE", "\u00df"}; 
    for (String str : strings) { 
     System.out.println(str.equalsIgnoreCase(str.toLowerCase())); 
     System.out.println(str.equalsIgnoreCase(str.toUpperCase())); 
    } 

đầu ra đúng 3 lần (trường hợp = trường hợp; trường hợp = TRƯỜNG HỢP; ß = ß) mà còn 1 sai (ß = SS!). Đã cố gắng sử dụng toLowerCase (Ngôn ngữ) nhưng nó không giúp được gì.

Đây có phải là sự cố đã biết không?

+1

Michael Kaplan đã viết rất nhiều về nhân vật Sharp S của Đức. Mọi thứ đã thay đổi gần đây và tôi hy vọng các thư viện sẽ chơi một số nội dung bắt kịp. Rất nhiều thông tin tốt ở đây: http://blogs.msdn.com/michkap/archive/2008/05/15/8506679.aspx –

Trả lời

10

Cho đến gần đây, Unicode không xác định phiên bản chữ hoa s-sharp. Tôi không chắc chắn liệu phiên bản Java 7 mới nhất đã bao gồm ký tự mới này và liệu nó có xử lý nó một cách chính xác hay không. Tôi đề nghị thử.

Lý do tại sao str.toLowerCase() không trả lại giống như str.toUpperCase().toLowerCase() là Java thay thế ß với SS nhưng không có cách nào để quay trở lại, vì vậy SS trở thành ss và so sánh thất bại.

Vì vậy, nếu bạn cần điều chỉnh trường hợp, bạn phải sử dụng str.toLowerCase(). Nếu không, sau đó chỉ cần gọi equalsIgnoreCase() mà không cần bất kỳ chuyển đổi trên/dưới nào cũng hoạt động.

+1

Thậm chí nếu Java 7 hỗ trợ ký tự Unicode mới, "ß" .toUpperCase() vẫn phải trả về "SS", vì chữ hoa "ß" chỉ là sở thích đánh máy và không thực sự được sử dụng trong tự nhiên: http: //en.wikipedia.org/wiki/Capital_ß –

+0

Trong trường hợp của tôi, tôi đang cố gắng kết hợp một số chuỗi của người dùng với các chuỗi được xác định trước (có lẽ tôi đã đề cập đến nó trong câu hỏi gốc ...) Vì vậy, mã tôi đưa ra ở đây là một ví dụ kiểm tra tôi đã thực hiện để hiểu tại sao mã ban đầu của tôi không hoạt động như mong đợi. Rõ ràng phương thức equalsIgnoreCase tồn tại để cứu chúng ta khỏi việc thay đổi trường hợp của một trong hai chuỗi. Dù sao, khái niệm "san lấp mặt bằng" là những gì làm cho câu trả lời được chấp nhận của tôi :-) – targumon

0

Hm. Tôi không biết bất cứ điều gì về ngôn ngữ Đức, nhưng tôi không chắc chắn làm thế nào tôi cảm thấy về các ký tự Unicode được coi là tương đương với một số mở rộng thư La Mã. Bạn có thể làm như sau?

myDictionary.put("glasses", new Bifocals()); 
myDictionary.get("glaßes"); 

Nếu bạn có druthers, myDictionary.get("glaßes") phải trả lại nội dung là Bifocals từ trước. Có phải đó không?

+2

"ß" và "ss" không tương đương. "ss" đôi khi được sử dụng để viết "ß" khi bức thư đó không có sẵn. Vì không có chữ hoa "ß" (ok, có một, nhưng nó chủ yếu là một sự tò mò về kiểu chữ và không phải là một chữ cái được sử dụng trong thực tế), nó sẽ luôn được viết là "SS" trong ALL CAPS. Điều ngược lại là không đúng: "SS". ToLower() chắc chắn là "ss". –

+0

Ah, gotcha. Cảm ơn vì đã làm rõ, Joachim. –

2

Aaron Digulla has it. Ngoài ra, nó không có ý nghĩa để chuyển đổi chuỗi trong trường hợp không có dữ liệu miền địa phương. Bằng tiếng Anh, chữ hoa trên của iI, nhưng bằng tiếng Thổ Nhĩ Kỳ là & # x0130;. String.compareIgnoreCase không tính đến dữ liệu địa phương.

(Là một sang một bên, bạn có thể muốn xem xét normalization, hoặc bạn sẽ kết thúc tự hỏi tại sao "& # x00E9;" bằng ("& # x0065; & # x0301;"). có thể trả về false . Lý do: một là một combining sequence)

+0

Thật kỳ quặc đối với tôi rằng lớp String có 2 phương thức mỗi đối với toLowerCase & toUpperCase (không có tham số + một phương thức chấp nhận Locale) nhưng chỉ có 1 phương thức cho mỗi equalsIgnoreCase & compareToIgnoreCase nếu các bạn ở Sun nghĩ rằng * trường hợp phương pháp nên được Locale nhạy cảm sau đó tôi mong đợi tất cả trong số họ cũng chấp nhận nó. Cảm ơn bạn đã liên kết bình thường hóa, đây là trường hợp quá mức cần thiết cho trường hợp của tôi, nhưng tất cả đều giống nhau. – targumon

+0

@targumon: Lưu ý rằng trong * tất cả * miền địa phương '" ß ".toUpperCase (miền địa phương)' trả về '" SS "', nhưng equalsIgnoreCase không quan tâm. Đó là tất cả bị hỏng bằng cách nào đó. – maaartinus

2

Unicode không xác định một phiên bản chữ hoa của s-sắc nét đây là điểm chính xác - bằng tiếng Đức không có khả năng xảy ra một sắc nét-s (. ß) là vốn hoặc chữ cái đầu của bất kỳ từ nào. do đó nó không có ý nghĩa tranh cãi về một vốn 01 ...

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