Pertanyaan mengubah ß.cfg ke huruf besar menggunakan toUpperCase () di java


Saya mencoba kode berikut

String s1 = new String ("ß.cfg");
System.out.println (s.toUpperCase());

output yang saya dapatkan adalah SS.CFG karena Unicode tidak mendefinisikan versi huruf besar ß sementara saya menginginkan output sebagai ß.CFG.

Apakah ada cara saya dapat mencapainya Terima kasih sebelumnya


5
2018-02-03 11:05


asal


Jawaban:


Dokumentasi untuk toUpperCase( Locale ) secara eksplisit menyatakan bahwa inilah yang akan terjadi:

Karena pemetaan kasus tidak selalu 1: 1 pemetaan char, String yang dihasilkan mungkin memiliki panjang yang berbeda dari String asli.

huruf kecil s tajam -> dua huruf: SS


5
2018-02-03 11:12



Karakter "ß" setara dengan "ss" (digunakan dalam bahasa Jerman, misalnya), dan ini didefinisikan sehingga di Locale Anda (Lokal yang Anda gunakan di aplikasi Anda).

Anda dapat mencoba melakukan beberapa eksperimen dengan metode menggunakan Lokal yang berbeda:

toUpperCase(Locale locale) 

Edit: Seperti kata pengguna, metode ini tidak valid, mungkin workaroud (tidak sangat elegan) adalah:

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

6
2018-02-03 11:09



Implementasi Java hanya mengikuti apa yang dikatakan spesifikasi Unicode. Dan Unicode mengatakan ini:

# ================================================================================
# 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

Referensi: http://unicode.org/Public/UNIDATA/SpecialCasing.txt

Jika Anda ingin menerapkan bentuk konversi huruf besar yang berbeda dengan Unicode, Anda harus menentukan dan menerapkannya sendiri.


(Jika Anda ingin melihat sekelompok orang semakin panas di bawah kerah tentang "huruf besar ß", baca utas email ini - http://unicode.org/mail-arch/unicode-ml/y2007-m05/0007.html )


3
2018-02-03 11:31



Mencoba java.lang.String.toUpperCase(java.util.Locale).


1
2018-02-03 11:08



Sepertinya Characeter.toUpperCase() mengabaikan aturan ini, sehingga Anda dapat menggunakannya untuk mengimplementasikan konversi yang diinginkan:

Metode pemetaan pola string memiliki beberapa manfaat dibandingkan metode pemetaan karakter. Metode pemetaan case string dapat melakukan pemetaan yang peka-lokal, pemetaan konteks-sensitif, dan pemetaan karakter 1: M, sedangkan metode pemetaan karakter tidak bisa.


0
2018-02-03 11:16



OP tidak menyatakan masalah dunia nyata apa yang ingin dia pecahkan. Mungkin ada pendekatan lain yang berhasil menyelesaikan masalah.

Saya menemukan masalah yang sama ketika saya mencoba menemukan kecocokan dalam suatu kasus secara independen. Saya menggunakan toUpperCase() untuk mencoba menormalkan string sebelum menggunakan perbandingan String.indexOf(), dan menemukan masalah dengan karakter ini.

Saya tidak menemukan tempat di mana toUpperCase() dari karakter ß menghasilkan apa pun kecuali SS (meskipun diakui saya tidak mencoba semua kemungkinan lokal).

Solusi saya adalah menggunakan String.toLowerCase() untuk pencocokan. Dalam kumpulan data saya, tidak ada insiden di mana melakukan itu akan mengubah jumlah karakter.

EDIT UNTUK MENAMBAHKAN - Sampel kode (seperti yang diminta):

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();
}

(Saya melemparkan di toUpperCase (). ToLowerCase () hanya untuk bersenang-senang, bukan sebagai solusi yang mungkin.)

Keluaran:

                SS    ss     ß
  Großenhain    -1    -1     3
 GROSSENHAIN     3    -1    -1
  großenhain    -1    -1     3
 grossenhain    -1     3    -1

-1
2017-11-18 15:59