2012-02-03 30 views

Trả lời

5

Các tài liệu cho toUpperCase(Locale) một cách rõ ràng rằng đây là những gì sẽ xảy ra:

Sin ánh xạ trường hợp ce không phải lúc nào cũng là ánh xạ char 1: 1, String kết quả có thể có độ dài khác với Chuỗi gốc.

s

thư nhỏ sắc nét -> hai chữ: SS

+0

có điều này xảy ra ngay cả sau khi chuyển miền địa phương. –

+0

Có ... nó nói trong tài liệu nó làm cho _all_ địa phương –

+0

là có cách nào tôi có thể đạt được những gì tôi đang cố gắng để làm gì? –

6

Ký tự "ß" tương đương với "ss" (được sử dụng bằng tiếng Đức) và điều này được xác định trong Ngôn ngữ của bạn (ngôn ngữ bạn đang sử dụng trong ứng dụng).

Bạn có thể thử để làm một số thử nghiệm với một Locale khác nhau sử dụng phương pháp:

toUpperCase(Locale locale) 

Chỉnh sửa: Khi người dùng cho biết, phương pháp này là không hợp lệ, một workaroud có thể (không phải là rất thanh lịch) là:

String s1 = new String ("auß.cfg").replace('ß', '\u9999'); 
    System.out.println (s1.toUpperCase(Locale.UK).replace('\u9999', 'ß')); 
+0

thậm chí đi qua kết quả locale là cùng không thay đổi sản lượng ở tất cả các –

+0

Bạn là đúng, 255 ký tự đầu tiên trong unicode được dịch với latin1 (lớp nhân vật): nếu (codePoint <= FAST_PATH_MAX) {// FAST_PATH_MAX = 255 upperCase = CharacterDataLatin1.toUpperCaseEx (codePoint); } else { ... – greuze

0

Dường như Characeter.toUpperCase() bỏ qua những quy tắc, vì vậy mà bạn có thể sử dụng nó để thực hiện việc chuyển đổi mong muốn:

Chuỗi trường hợp phương pháp ánh xạ có nhiều lợi ích hơn các phương thức ánh xạ trường hợp ký tự. Các phương thức ánh xạ trường hợp chuỗi có thể thực hiện ánh xạ nhạy cảm miền, ánh xạ nhạy cảm theo ngữ cảnh và ánh xạ ký tự 1: M, trong khi các phương thức ánh xạ trường hợp ký tự không thể.

3

Việc triển khai Java chỉ đơn giản là theo những gì đặc tả Unicode nói. Và Unicode nói điều này:

# ================================================================================ 
# Unconditional mappings 
# ================================================================================ 

# The German es-zed is special--the normal mapping is to SS. 
# Note: the titlecase should never occur in practice. It is equal to titlecase(uppercase(<es-zed>)) 

00DF; 00DF; 0053 0073; 0053 0053; # LATIN SMALL LETTER SHARP S 

tham khảo: http://unicode.org/Public/UNIDATA/SpecialCasing.txt

Nếu bạn muốn thực hiện một hình thức chuyển đổi chữ hoa đó là khác nhau sang Unicode, bạn sẽ cần phải xác định và thực hiện nó cho mình.


(Nếu bạn muốn xem một bó của những người nhận được nóng dưới cổ áo về "hoa ß", đọc chủ đề này email - http://unicode.org/mail-arch/unicode-ml/y2007-m05/0007.html)

-1

Các OP không nói rõ những gì thực tế vấn đề anh/cô ấy đang cố gắng giải quyết. Có thể có một cách tiếp cận khác sẽ giải quyết thành công vấn đề.

Tôi đã gặp một vấn đề tương tự khi tôi cố gắng tìm các kết quả phù hợp theo cách độc lập.Tôi đã sử dụng toUpperCase() để cố gắng chuẩn hóa các chuỗi trước khi so sánh bằng cách sử dụng String.indexOf() và đã tìm thấy sự cố với ký tự này.

Tôi không tìm thấy ngôn ngữ nào trong đó toUpperCase() của ký tự ß dẫn đến bất cứ điều gì trừ SS (mặc dù thừa nhận rằng tôi không thử tất cả các ngôn ngữ có thể).

Giải pháp của tôi là sử dụng String.toLowerCase() để khớp. Trong tập dữ liệu của tôi, không có sự cố khi làm điều đó sẽ thay đổi số ký tự.

Chỉnh sửa để thêm - Một mẫu mã (theo yêu cầu):

String[] matches = "SS,ss,ß".split(","); 
System.out.printf("%12s %5s %5s %5s\n", " ", matches[0], matches[1], matches[2]); 
String g = "Großenhain"; 
for (String g1 : new String[]{g, g.toUpperCase(), g.toLowerCase(), g.toUpperCase().toLowerCase()}) 
{ 
    System.out.printf("%12s", g1); 
    for (String match : matches) 
     System.out.printf(" %5d", g1.indexOf(match)); 
    System.out.println(); 
} 

(Tôi đã ném trong toUpperCase() toLowerCase() chỉ để cho vui, không phải là một giải pháp khả thi..)

Output:

   SS ss  ß 
    Großenhain -1 -1  3 
GROSSENHAIN  3 -1 -1 
    großenhain -1 -1  3 
grossenhain -1  3 -1 
Các vấn đề liên quan