Apakah ada cara untuk menghilangkan aksen dan mengubah seluruh string menjadi huruf biasa?

263

Apakah ada cara yang lebih baik untuk menghilangkan aksen dan membuat surat-surat itu teratur selain menggunakan String.replaceAll()metode dan mengganti huruf satu per satu? Contoh:

Memasukkan: orčpžsíáýd

Keluaran: orcpzsiayd

Tidak perlu menyertakan semua huruf dengan aksen seperti alfabet Rusia atau yang Cina.

Martin
sumber

Jawaban:

387

Gunakan java.text.Normalizeruntuk menangani ini untuk Anda.

string = Normalizer.normalize(string, Normalizer.Form.NFD);
// or Normalizer.Form.NFKD for a more "compatable" deconstruction 

Ini akan memisahkan semua tanda aksen dari karakter. Kemudian, Anda hanya perlu membandingkan setiap karakter dengan menjadi huruf dan membuang yang tidak.

string = string.replaceAll("[^\\p{ASCII}]", "");

Jika teks Anda berada dalam unicode, Anda harus menggunakan ini sebagai gantinya:

string = string.replaceAll("\\p{M}", "");

Untuk unicode, \\P{M}cocok dengan mesin terbang dasar dan \\p{M}(huruf kecil) cocok dengan masing-masing aksen.

Terima kasih kepada GarretWilson untuk penunjuk dan regular-expressions.info untuk panduan unicode yang hebat.

Erick Robertson
sumber
7
Ini mengkompilasi ekspresi reguler setiap kali, yang baik jika Anda hanya membutuhkannya sekali, tetapi jika Anda perlu melakukan ini dengan banyak teks, pra-kompilasi regex adalah kemenangan.
David Conrad
3
Perhatikan bahwa tidak semua huruf berbasis Latin terurai menjadi aksen ASCII +. Ini akan membunuh mis. "Latin {capital, small} letter l with stroke" digunakan dalam bahasa Polandia.
Michał Politowski
12
Ini adalah pendekatan yang baik, tetapi menghapus semua karakter non-ASCII berlebihan dan mungkin akan menghapus hal-hal yang tidak Anda inginkan, seperti yang telah ditunjukkan orang lain. Akan lebih baik untuk menghapus semua "tanda" Unicode; termasuk tanda non-spasi, tanda spasi / kombinasi, dan tanda penutup. Anda dapat melakukannya dengan string.replaceAll("\\p{M}", ""). Lihat regular-expressions.info/unicode.html untuk informasi lebih lanjut.
Garret Wilson
4
Anda mungkin ingin menggunakan Normalizer.Form.NFKD daripada NFD - NFKD akan mengubah hal-hal seperti ligatures menjadi karakter ascii (mis. Fi), NFD tidak akan melakukan ini.
chesterm8
2
@ chesterm8, yang menarik NFKD mengonversi "fi" menjadi "fi", tetapi itu tidak mengubah "conver" menjadi "AE". Saya kira saya harus membuka data Unicode untuk mencari tahu mengapa, tapi itu bukan yang saya harapkan.
Garret Wilson
136

Pada 2011 Anda dapat menggunakan Apache Commons StringUtils.stripAccents (input) (sejak 3.0):

    String input = StringUtils.stripAccents("Tĥïŝ ĩš â fůňķŷ Šťŕĭńġ");
    System.out.println(input);
    // Prints "This is a funky String"

catatan:

Jawaban yang diterima (Erick Robertson) tidak berfungsi untuk Ø atau Ł. Apache Commons 3.5 juga tidak berfungsi untuk Ø, tetapi ia berfungsi untuk Ł. Setelah membaca artikel Wikipedia untuk Ø , saya tidak yakin itu harus diganti dengan "O": ini adalah huruf terpisah dalam bahasa Norwegia dan Denmark, diurutkan berdasarkan abjad setelah "z". Ini adalah contoh yang baik dari keterbatasan pendekatan "aksen strip".

DavidS
sumber
2
Saya melihat ada laporan bug terbuka untuk Ł , @KarolS. Seseorang mengajukan permintaan penarikan, tetapi gagal dalam beberapa tes dan belum diperbarui sejak Juli tahun lalu.
DavidS
1
Ada pembaruan di sana 5 hari yang lalu dan permintaan tarik telah digabungkan.
EpicPandaForce
6
Commons Lang 3.5 dirilis beberapa hari yang lalu. Saya mengkonfirmasi bahwa itu berfungsi pada Ł sekarang. Itu tidak berfungsi pada Ø. Membaca artikel Wiki untuk Ø , saya tidak yakin itu harus diganti dengan "O": ini adalah huruf terpisah dalam bahasa Norwegia dan Denmark, diurutkan berdasarkan abjad setelah "z". Ini adalah contoh yang baik dari keterbatasan pendekatan "aksen strip".
DavidS
2
Jika Anda tidak ingin memasukkan pustaka, Anda dapat mengambil dua metode yang terlibat dalam fitur itu dengan mudah dari sumber di commons.apache.org/proper/commons-lang/apidocs/src-html/org/…
lujop
2
Sebagai orang Denmark, bahasa Denmark / Norwegia ø seperti bahasa Prancis œ dan bahasa Jerman / Swedia / Hongaria / Estonia dll. Ö berasal sebagai cara singkat untuk menulis oe. Jadi tergantung pada tujuan Anda, ini mungkin substitusi yang Anda inginkan.
Ole VV
57

Solusi oleh @ virgo47 sangat cepat, tetapi perkiraan. Jawaban yang diterima menggunakan Normalizer dan ekspresi reguler. Saya bertanya-tanya bagian waktu apa yang diambil oleh Normalizer versus ekspresi reguler, karena menghapus semua karakter non-ASCII dapat dilakukan tanpa regex:

import java.text.Normalizer;

public class Strip {
    public static String flattenToAscii(String string) {
        StringBuilder sb = new StringBuilder(string.length());
        string = Normalizer.normalize(string, Normalizer.Form.NFD);
        for (char c : string.toCharArray()) {
            if (c <= '\u007F') sb.append(c);
        }
        return sb.toString();
    }
}

Speed-up tambahan kecil dapat diperoleh dengan menulis ke char [] dan tidak memanggil toCharArray (), meskipun saya tidak yakin bahwa penurunan kejelasan kode layak untuk itu:

public static String flattenToAscii(String string) {
    char[] out = new char[string.length()];
    string = Normalizer.normalize(string, Normalizer.Form.NFD);
    int j = 0;
    for (int i = 0, n = string.length(); i < n; ++i) {
        char c = string.charAt(i);
        if (c <= '\u007F') out[j++] = c;
    }
    return new String(out);
}

Variasi ini memiliki keunggulan kebenaran yang menggunakan Normalizer dan beberapa kecepatan yang menggunakan tabel. Di komputer saya, yang ini sekitar 4x lebih cepat dari jawaban yang diterima, dan 6,6x ke 7x lebih lambat dari yang @ virgo47's (jawaban yang diterima adalah sekitar 26x lebih lambat dari @ virgo47 di mesin saya).

David Conrad
sumber
2
outharus diubah ukurannya agar sesuai dengan jumlah karakter yang valid jsebelum digunakan untuk membangun objek string.
Lefteris E
4
Saya keberatan dengan solusi ini. Bayangkan input "æøåá". Saat ini flattenToAsciimenciptakan hasil "aa .." di mana titik mewakili \ u0000. Itu tidak baik. Pertanyaan pertama adalah - bagaimana cara merepresentasikan karakter yang "tidak dapat dinormalisasi"? Katakanlah itu akan menjadi ?, atau kita dapat meninggalkan NULL char di sana, tetapi dalam hal apa pun kita harus mempertahankan posisi yang benar dari semua ini (seperti halnya solusi regex). Untuk ini, jika dalam loop harus seperti: if (c <= '\u007F') out[j++] = c; else if (Character.isLetter(c)) out[j++] = '?';Ini akan memperlambatnya sedikit, tetapi harus benar di tempat pertama. ;-)
virgo47
Iklan komentar terakhir saya (terlalu buruk mereka tidak bisa lebih lama) - mungkin positif take ( isLetter) bukan yang tepat, tetapi saya tidak menemukan yang lebih baik. Saya bukan ahli Unicode, jadi saya tidak tahu bagaimana mengidentifikasi kelas karakter tunggal yang menggantikan karakter asli dengan lebih baik. Surat berfungsi dengan baik untuk sebagian besar aplikasi / penggunaan.
virgo47
1
Anda mungkin ingin menggunakan Normalizer.Form.NFKD daripada NFD - NFKD akan mengubah hal-hal seperti ligatures menjadi karakter ascii (mis. Fi), NFD tidak akan melakukan ini.
chesterm8
2
Bagi kami, kami ingin menghapus karakter sama sekali. Untuk memastikan tidak ada karakter nol yang tertinggal, saya menghapusnya dengan konstruktor String alternatif: kembalikan String baru (keluar, 0, j);
Mike Samaras
30

EDIT: Jika Anda tidak terjebak dengan Java <6 dan kecepatan tidak kritis dan / atau tabel terjemahan terlalu terbatas, gunakan jawaban oleh David. Intinya adalah menggunakanNormalizer (diperkenalkan di Java 6) alih-alih tabel terjemahan di dalam loop.

Meskipun ini bukan solusi "sempurna", ini bekerja dengan baik ketika Anda tahu kisaran (dalam kasus kami Latin1,2), bekerja sebelum Java 6 (bukan masalah sebenarnya) dan jauh lebih cepat daripada versi yang paling disarankan (mungkin atau mungkin tidak menjadi masalah):

    /**
 * Mirror of the unicode table from 00c0 to 017f without diacritics.
 */
private static final String tab00c0 = "AAAAAAACEEEEIIII" +
    "DNOOOOO\u00d7\u00d8UUUUYI\u00df" +
    "aaaaaaaceeeeiiii" +
    "\u00f0nooooo\u00f7\u00f8uuuuy\u00fey" +
    "AaAaAaCcCcCcCcDd" +
    "DdEeEeEeEeEeGgGg" +
    "GgGgHhHhIiIiIiIi" +
    "IiJjJjKkkLlLlLlL" +
    "lLlNnNnNnnNnOoOo" +
    "OoOoRrRrRrSsSsSs" +
    "SsTtTtTtUuUuUuUu" +
    "UuUuWwYyYZzZzZzF";

/**
 * Returns string without diacritics - 7 bit approximation.
 *
 * @param source string to convert
 * @return corresponding string without diacritics
 */
public static String removeDiacritic(String source) {
    char[] vysl = new char[source.length()];
    char one;
    for (int i = 0; i < source.length(); i++) {
        one = source.charAt(i);
        if (one >= '\u00c0' && one <= '\u017f') {
            one = tab00c0.charAt((int) one - '\u00c0');
        }
        vysl[i] = one;
    }
    return new String(vysl);
}

Tes pada HW saya dengan 32bit JDK menunjukkan bahwa ini melakukan konversi dari àèľšťč89FDČ ke aeelstc89FDC 1 juta kali dalam ~ 100ms sementara cara Normalizer membuatnya dalam 3,7s (37x lebih lambat). Jika kebutuhan Anda berada di sekitar kinerja dan Anda tahu kisaran input, ini mungkin untuk Anda.

Nikmati :-)

virgo47
sumber
1
Banyak kelambatan dari versi yang disarankan adalah karena ekspresi reguler, bukan Normalizer. Menggunakan Normalizer tetapi menghapus karakter non-ASCII 'dengan tangan' lebih cepat, meskipun masih tidak secepat versi Anda. Tapi itu berfungsi untuk semua Unicode, bukan hanya latin1 dan latin2.
David Conrad
Saya memperluas ini untuk bekerja dengan lebih banyak karakter, pastebin.com/FAAm6a2j , Perhatikan itu tidak akan berfungsi dengan benar dengan karakter multichar seperti DŽ (DZ). Itu hanya akan menghasilkan 1 karakter dari itu. Juga fungsi saya menggunakan char bukan string, yang lebih cepat JIKA Anda menangani char anyways, jadi Anda tidak perlu mengkonversi.
James T
Hei, saya tidak mengerti untuk apa huruf-huruf pada field tab00c0 berdiri? misalnya "AAAAAAAACEEEEIIII" atau "lLlNnNnNnnnNnOoOo" dll. Tidak pernah melihatnya sebelumnya. Di mana Anda menemukannya? Juga mengapa Anda tidak menggunakan kode yang sesuai saja?
ThanosFisherman
@HanosF hanya mencoba untuk pergi melalui kode (dengan debugger jika diperlukan). Apa yang dilakukan adalah untuk setiap karakter dalam string: "Apakah karakter ini antara \ u00c0 dan \ u017f? Jika demikian, ganti dengan karakter ASCII 7bit dari tabel." Tabel hanya mencakup dua halaman penyandian (Latin 1 dan 2) dengan setara 7bit mereka. Jadi jika karakter dengan kode \ u00e0 (à) akan mengambil perkiraan 7bit dari posisi ke-32 tabel (e0-c0 = 32) - yaitu "a". Beberapa karakter bukan huruf, yang tersisa di sana dengan kode mereka.
virgo47
Terima kasih atas penjelasan anda Di mana saya dapat menemukan halaman-halaman penyandian sehingga saya dapat memperluas Variabel ini ke bahasa saya? (Yunani) Jawaban yang diterima sudah melakukan pekerjaan menggantikan huruf-huruf beraksen Yunani tetapi saya ingin mencoba metode Anda juga dan menjalankan beberapa tolok ukur :)
ThanosFisherman
22
System.out.println(Normalizer.normalize("àèé", Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", ""));

bekerja untukku. Output dari cuplikan di atas memberikan "aee" yang memang saya inginkan, tetapi

System.out.println(Normalizer.normalize("àèé", Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", ""));

tidak melakukan substitusi.

Nico
sumber
1
Mengkonfirmasi ini ... biasanya ASCII berfungsi dengan baik, tapi saya mengalami masalah ini di Linux (64b) dengan JRockit (1.6.0_29 64b). Tidak dapat mengonfirmasi dengan pengaturan lain, tidak dapat mengonfirmasi korelasi itu, tetapi saya dapat mengonfirmasi bahwa solusi yang disarankan lainnya berhasil dan untuk itu saya memilih yang ini. :-) (BTW: Itu melakukan beberapa penggantian, tetapi tidak cukup, itu berubah Ú menjadi U misalnya, tetapi tidak á ke a.)
virgo47
1
Anda mungkin ingin menggunakan Normalizer.Form.NFKD daripada NFD - NFKD akan mengubah hal-hal seperti ligatures menjadi karakter ascii (mis. Fi), NFD tidak akan melakukan ini.
chesterm8
@ KarolS Saya tidak melihat salah satu dari mereka yang mengandung aksen
eis
@ eis Garis miring pada sebuah surat dianggap sebagai diakritik: en.wikipedia.org/wiki/Diacritic Dan jika Anda menggunakan definisi "aksen" yang lebih tegas seperti pada halaman Wikipedia itu, maka diaeresis bukan aksen, jadi jawaban Nico masih salah.
Karol S
6

Bergantung pada bahasanya, itu mungkin tidak dianggap aksen (yang mengubah bunyi surat), tetapi tanda diakritik

https://en.wikipedia.org/wiki/Diacritic#Languages_with_letters_containing_diacritics

"Bahasa Bosnia dan Kroasia memiliki simbol č, ć, đ, š, dan ž, yang dianggap sebagai huruf terpisah dan didaftar seperti itu dalam kamus dan konteks lain di mana kata-kata terdaftar sesuai dengan urutan abjad."

Menghapusnya mungkin secara inheren mengubah arti kata, atau mengubah huruf menjadi yang sangat berbeda.

NinjaCat
sumber
5
Sepakat. Misalnya dalam bahasa Swedia: "höra" (dengar) -> "hora" (pelacur)
Christoffer Hammarström
14
Tidak masalah apa artinya. Pertanyaannya adalah bagaimana cara menghapusnya.
Erick Robertson
7
Erick: Itu penting apa yang mereka sebut. Jika pertanyaannya bertanya bagaimana cara menghilangkan aksen, dan jika itu bukan aksen, maka jawabannya mungkin bukan hanya cara menghapus semua hal yang terlihat seperti aksen. Padahal ini mungkin harus menjadi komentar dan bukan jawaban.
Smig
4
Saya pikir kasus penggunaan normal untuk ini adalah pencarian, terutama pencarian bahasa campuran, sering dengan keyboard bahasa Inggris sebagai input, dalam hal ini lebih baik untuk mendapatkan positif palsu daripada negatif palsu.
nilskp
3

Saya telah menghadapi masalah yang sama terkait dengan pemeriksaan persamaan Strings, Salah satu string pembanding memiliki kode karakter ASCII 128-255 .

yaitu ruang Non-breaking - [Hex - A0] Space [Hex - 20]. Untuk menampilkan ruang tanpa putus di atas HTML. Saya telah menggunakan yang berikut ini spacing entities. Karakter dan byte mereka seperti&emsp is very wide space[ ]{-30, -128, -125}, &ensp is somewhat wide space[ ]{-30, -128, -126}, &thinsp is narrow space[ ]{32} , Non HTML Space {}

String s1 = "My Sample Space Data", s2 = "My Sample Space Data";
System.out.format("S1: %s\n", java.util.Arrays.toString(s1.getBytes()));
System.out.format("S2: %s\n", java.util.Arrays.toString(s2.getBytes()));

Output dalam Bytes:

S1: [77, 121,, 3283, 97, 109, 112, 108, 101,, 3283, 112, 97, 99, 101 32,, 68, 97, 116, 97] S2: [77, 121 -30, -128, -125,, 83, 97, 109, 112, 108, 101,, -30, -128, -12583, 112, 97, 99, 101 -30, -128, -125,, 68, 97, 116, 97]

Gunakan kode di bawah ini untuk Ruang yang Berbeda dan Kode-Byte mereka: wiki for List_of_Unicode_characters

String spacing_entities = "very wide space,narrow space,regular space,invisible separator";
System.out.println("Space String :"+ spacing_entities);
byte[] byteArray = 
    // spacing_entities.getBytes( Charset.forName("UTF-8") );
    // Charset.forName("UTF-8").encode( s2 ).array();
    {-30, -128, -125, 44, -30, -128, -126, 44, 32, 44, -62, -96};
System.out.println("Bytes:"+ Arrays.toString( byteArray ) );
try {
    System.out.format("Bytes to String[%S] \n ", new String(byteArray, "UTF-8"));
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}
  • ➩ transliterasi string Unicode ASCII untuk Java. unidecode

    String initials = Unidecode.decode( s2 );
  • ➩ menggunakan Guava: Google Core Libraries for Java.

    String replaceFrom = CharMatcher.WHITESPACE.replaceFrom( s2, " " );

    Untuk penyandian URL untuk ruang gunakan laibrary Guava.

    String encodedString = UrlEscapers.urlFragmentEscaper().escape(inputString);
  • ➩ Untuk mengatasi masalah ini digunakan String.replaceAll()dengan beberapa RegularExpression.

    // \p{Z} or \p{Separator}: any kind of whitespace or invisible separator.
    s2 = s2.replaceAll("\\p{Zs}", " ");
    
    
    s2 = s2.replaceAll("[^\\p{ASCII}]", " ");
    s2 = s2.replaceAll(" ", " ");
  • ➩ Menggunakan java.text.Normalizer.Form . Enum ini memberikan konstanta dari empat bentuk normalisasi Unicode yang dijelaskan dalam Unicode Standard Annex # 15 - Bentuk Normalisasi Unicode dan dua metode untuk mengaksesnya.

    masukkan deskripsi gambar di sini

    s2 = Normalizer.normalize(s2, Normalizer.Form.NFKC);

Menguji String dan output pada pendekatan berbeda seperti ➩ Unidecode, Normalizer, StringUtils .

String strUni = "Tĥïŝ ĩš â fůňķŷ Šťŕĭńġ Æ,Ø,Ð,ß";

// This is a funky String AE,O,D,ss
String initials = Unidecode.decode( strUni );

// Following Produce this o/p: Tĥïŝ ĩš â fůňķŷ Šťŕĭńġ Æ,Ø,Ð,ß
String temp = Normalizer.normalize(strUni, Normalizer.Form.NFD);
Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
temp = pattern.matcher(temp).replaceAll("");

String input = org.apache.commons.lang3.StringUtils.stripAccents( strUni );

Menggunakan Unidecode adalah best choice, Kode akhir saya ditunjukkan di bawah ini.

public static void main(String[] args) {
    String s1 = "My Sample Space Data", s2 = "My Sample Space Data";
    String initials = Unidecode.decode( s2 );
    if( s1.equals(s2)) { //[ , ] %A0 - %2C - %20 « http://www.ascii-code.com/
        System.out.println("Equal Unicode Strings");
    } else if( s1.equals( initials ) ) {
        System.out.println("Equal Non Unicode Strings");
    } else {
        System.out.println("Not Equal");
    }

}
Yash
sumber
3

Saya menyarankan Junidecode . Ini tidak hanya akan menangani 'Ł' dan 'Ø', tetapi juga berfungsi dengan baik untuk menyalin dari huruf lain, seperti Cina, ke alfabet Latin.

OlgaMaciaszek
sumber
1
Terlihat menjanjikan, tetapi saya berharap ini adalah proyek yang lebih aktif / dikelola dan tersedia di Maven.
Phil
2

@ David Conrad solusi adalah yang tercepat saya mencoba menggunakan Normalizer, tetapi memang memiliki bug. Ini pada dasarnya menelanjangi karakter yang bukan aksen, misalnya karakter Cina dan huruf lain seperti æ, semuanya dilucuti. Karakter yang ingin kita hapus adalah tanda tanpa spasi, karakter yang tidak mengambil lebar ekstra dalam string terakhir. Karakter nol lebar ini pada dasarnya digabungkan dalam beberapa karakter lain. Jika Anda dapat melihat mereka terisolasi sebagai karakter, misalnya seperti ini `, tebakan saya adalah bahwa itu dikombinasikan dengan karakter spasi.

public static String flattenToAscii(String string) {
    char[] out = new char[string.length()];
    String norm = Normalizer.normalize(string, Normalizer.Form.NFD);

    int j = 0;
    for (int i = 0, n = norm.length(); i < n; ++i) {
        char c = norm.charAt(i);
        int type = Character.getType(c);

        //Log.d(TAG,""+c);
        //by Ricardo, modified the character check for accents, ref: http://stackoverflow.com/a/5697575/689223
        if (type != Character.NON_SPACING_MARK){
            out[j] = c;
            j++;
        }
    }
    //Log.d(TAG,"normalized string:"+norm+"/"+new String(out));
    return new String(out);
}
Ricardo Freitas
sumber
1

Salah satu cara terbaik menggunakan regex dan Normalizer jika Anda tidak memiliki perpustakaan adalah:

    public String flattenToAscii(String s) {
                if(s == null || s.trim().length() == 0)
                        return "";
                return Normalizer.normalize(s, Normalizer.Form.NFD).replaceAll("[\u0300-\u036F]", "");
}

Ini lebih efisien daripada replaceAll ("[^ \ p {ASCII}]", "")) dan jika Anda tidak memerlukan diakritik (seperti contoh Anda).

Jika tidak, Anda harus menggunakan pola p {ASCII}.

Salam.

Zhar
sumber
0

Saya pikir solusi terbaik adalah mengkonversi masing-masing char ke HEX dan menggantinya dengan HEX lain Itu karena ada 2 pengetikan Unicode:

Composite Unicode
Precomposed Unicode

Misalnya "Ồ" yang ditulis oleh Unicode Komposit berbeda dari "Ồ" yang ditulis oleh Unicomp Precomposed. Anda dapat menyalin karakter sampel saya dan mengonversinya untuk melihat perbedaannya.

In Composite Unicode, "Ồ" is combined from 2 char: Ô (U+00d4) and ̀ (U+0300)
In Precomposed Unicode, "Ồ" is single char (U+1ED2)

Saya telah mengembangkan fitur ini untuk beberapa bank untuk mengkonversi informasi sebelum mengirimnya ke bank inti (biasanya tidak mendukung Unicode) dan menghadapi masalah ini ketika pengguna akhir menggunakan beberapa pengetikan Unicode untuk memasukkan data. Jadi saya pikir, mengonversi ke HEX dan menggantinya adalah cara yang paling dapat diandalkan.

Hoang Tran
sumber
-1

Jika ada orang yang berusaha melakukan ini di kotlin, kode ini berfungsi seperti mantra. Untuk menghindari ketidakkonsistenan, saya juga menggunakan .toUpperCase dan Trim (). maka saya menggunakan fungsi ini:

   fun stripAccents(s: String):String{

   if (s == null) {
      return "";
   }

val chars: CharArray = s.toCharArray()

var sb = StringBuilder(s)
var cont: Int = 0

while (chars.size > cont) {
    var c: kotlin.Char
    c = chars[cont]
    var c2:String = c.toString()
   //these are my needs, in case you need to convert other accents just Add new entries aqui
    c2 = c2.replace("Ã", "A")
    c2 = c2.replace("Õ", "O")
    c2 = c2.replace("Ç", "C")
    c2 = c2.replace("Á", "A")
    c2 = c2.replace("Ó", "O")
    c2 = c2.replace("Ê", "E")
    c2 = c2.replace("É", "E")
    c2 = c2.replace("Ú", "U")

    c = c2.single()
    sb.setCharAt(cont, c)
    cont++

}

return sb.toString()

}

untuk menggunakan ini, berikan kode seperti ini:

     var str: String
     str = editText.text.toString() //get the text from EditText
     str = str.toUpperCase().trim()

     str = stripAccents(str) //call the function
Thiago Silva
sumber