Saya mencoba untuk mengkonversi beberapa string yang dalam bahasa Prancis Kanada dan pada dasarnya, saya ingin dapat mengeluarkan tanda aksen Prancis dalam huruf sambil menjaga surat itu. (Misalnya dikonversi é
menjadi e
, jadi crème brûlée
akan menjadi creme brulee
)
Apa metode terbaik untuk mencapai ini?
.net
string
diacritics
James Hall
sumber
sumber
Jawaban:
Saya belum pernah menggunakan metode ini, tetapi Michael Kaplan menjelaskan metode untuk melakukannya di posting blog-nya (dengan judul yang membingungkan) yang berbicara tentang stripping diakritik: Stripping adalah pekerjaan yang menarik (alias Tentang arti tanpa makna, alias Semua karakter Mn) non-spacing, tetapi beberapa lebih non-spacing daripada yang lain)
Perhatikan bahwa ini adalah tindak lanjut dari posting sebelumnya: Stripping diacritics ....
Pendekatan ini menggunakan String.Normalisasi untuk membagi string input menjadi mesin terbang konstituen (pada dasarnya memisahkan karakter "basis" dari diakritik) dan kemudian memindai hasilnya dan hanya mempertahankan karakter dasar. Itu hanya sedikit rumit, tetapi sebenarnya Anda sedang melihat masalah yang rumit.
Tentu saja, jika Anda membatasi diri Anda ke bahasa Prancis, Anda mungkin bisa lolos dengan pendekatan berbasis tabel sederhana di Cara menghapus aksen dan tilde dalam string C ++ std :: , seperti yang direkomendasikan oleh @David Dibben.
sumber
ini melakukan trik untuk saya ...
cepat & pendek!
sumber
«
»
dan…
(sebagai karakter tunggal) akan diubah dalam proses yang tidak terjadi pada solusi yang diterima.System.ArgumentException: 'ISO-8859-8' is not a supported encoding name.
System.Text.Encoding.CodePages
dari nuget, lalu panggil ini untuk mendaftarkan penyedia:Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- setelah Anda selesai melakukannya, Anda dapat menggunakan ISO-8859-8Jika seseorang tertarik, saya mencari yang serupa dan akhirnya menulis yang berikut ini:
sumber
c < 128
, untuk memastikan bahwa kami tidak mengambil karakter UTF, lihat di sini .c < 123
. lihat ASCISaya membutuhkan sesuatu yang mengubah semua karakter unicode utama dan jawaban yang terpilih meninggalkan beberapa sehingga saya telah membuat versi CodeIgniter
convert_accented_characters($str)
menjadi C # yang mudah disesuaikan:Pemakaian
sumber
if (entry.Key.IndexOf(c) != -1)
menjadiif (entry.Key.Contains(c))
{ "äæǽ", "ae" }
bukan{ "ä", "ae" }, { "æ", "ae" }, { "ǽ", "ae" }
hanya meneleponif (foreign_characters.TryGetValue(...)) ...
. Anda telah benar-benar mengalahkan tujuan indeks yang sudah dimiliki kamus.Jika ada yang tertarik, ini adalah padanan java:
sumber
Saya sering menggunakan metode extenstion berdasarkan versi lain yang saya temukan di sini (lihat Mengganti karakter dalam C # (ascii) ) Penjelasan cepat:
Kode:
sumber
CodePage of Greek (ISO) dapat melakukannya
Informasi tentang codepage ini dimasukkan
System.Text.Encoding.GetEncodings()
. Pelajari tentang di: https://msdn.microsoft.com/pt-br/library/system.text.encodinginfo.getencoding(v=vs.110).aspxBahasa Yunani (ISO) memiliki codepage 28597 dan nama iso-8859-7 .
Buka kode ... \ o /
Jadi, tulis fungsi ini ...
Perhatikan bahwa ...
Encoding.GetEncoding("iso-8859-7")
sama denganEncoding.GetEncoding(28597)
karena pertama adalah nama, dan kedua codepage Pengkodean.sumber
äáčďěéíľľňôóřŕšťúůýž ÄÁČĎĚÉÍĽĽŇÔÓŘŔŠŤÚŮÝŽ ÖÜË łŁđĐ ţŢşŞçÇ øı
). Masalah hanya ditemukan denganßə
, yang dikonversi menjadi?
, tetapi pengecualian tersebut selalu dapat ditangani secara terpisah. Sebelum memasukkan ini ke dalam produksi, tes harus dilakukan dengan lebih baik terhadap semua area Unicode yang mengandung huruf dengan diakritik.Lucu pertanyaan seperti itu bisa mendapatkan begitu banyak jawaban, dan belum ada yang memenuhi persyaratan saya :) Ada begitu banyak bahasa di sekitar, solusi agnostik bahasa penuh adalah AFAIK tidak benar-benar mungkin, karena orang lain telah menyebutkan bahwa FormC atau FormD memberikan masalah.
Karena pertanyaan aslinya terkait dengan bahasa Prancis, jawaban yang paling sederhana memang
1251 harus diganti dengan kode penyandian dari bahasa input.
Namun ini hanya mengganti satu karakter dengan satu karakter. Karena saya juga bekerja dengan Jerman sebagai input, saya melakukan konversi manual
Mungkin tidak memberikan kinerja terbaik, tetapi setidaknya sangat mudah dibaca dan diperluas. Regex adalah TIDAK PERGI, jauh lebih lambat daripada hal-hal char / string.
Saya juga memiliki metode yang sangat sederhana untuk menghapus ruang:
Akhirnya, saya menggunakan kombinasi ketiga ekstensi di atas:
Dan tes unit kecil untuk itu (tidak lengkap) yang berhasil lulus.
sumber
Ini berfungsi baik di java.
Ini pada dasarnya mengubah semua karakter beraksen menjadi rekan deAccented mereka diikuti oleh kombinasi diakritik mereka. Sekarang Anda dapat menggunakan regex untuk menghapus diakritik.
sumber
"\\p{Block=CombiningDiacriticalMarks}"
Metode ekstensi string TL; DR - C #
Saya pikir solusi terbaik untuk mempertahankan makna string adalah dengan mengkonversi karakter daripada stripping mereka, yang diilustrasikan dengan baik dalam contoh
crème brûlée
kecrme brle
vs.creme brulee
.Saya memeriksa komentar Alexander di atas dan melihat kode Lucene.Net adalah lisensi Apache 2.0, jadi saya telah memodifikasi kelas menjadi metode ekstensi string sederhana. Anda bisa menggunakannya seperti ini:
Fungsi ini terlalu panjang untuk dikirim dalam jawaban StackOverflow (~ 139k karakter dari 30k diperbolehkan lol) jadi saya membuat intisari dan menghubungkan penulis :
Semoga itu bisa membantu orang lain, ini adalah solusi paling kuat yang saya temukan!
sumber
INI ADALAH VERSI VB (Bekerja dengan YUNANI):
Impor Sistem. Teks
Sistem Impor. Globalisasi
sumber
Coba paket HelperSharp .
Ada metode RemoveAccents:
sumber
Ini adalah bagaimana saya mengganti karakter diakritik ke yang non-diakritik di semua program .NET saya
C #:
VB .NET:
sumber
Anda dapat menggunakan ekstensi string dari paket nuget MMLib.Extensions:
Halaman Nuget: https://www.nuget.org/packages/MMLib.Extensions/ situs proyek Codeplex https://mmlib.codeplex.com/
sumber
Munculkan Perpustakaan ini di sini jika Anda belum mempertimbangkannya. Sepertinya ada berbagai unit test dengan itu.
https://github.com/thomasgalliker/Diacritics.NET
sumber
sumber
Apa kata orang ini:
Encoding.ASCII.GetString(Encoding.GetEncoding(1251).GetBytes(text));
Ini benar-benar membagi suka
å
yang merupakan satu karakter (yang merupakan kode karakter00E5
, bukan0061
ditambah pengubah030A
yang akan terlihat sama) menjadia
ditambah beberapa jenis pengubah, dan kemudian konversi ASCII menghapus pengubah, meninggalkan satu-satunyaa
.sumber
Saya sangat suka kode ringkas dan fungsional yang disediakan oleh azrafe7 . Jadi, saya telah mengubahnya sedikit untuk mengubahnya menjadi metode ekstensi:
sumber
Tidak memiliki reputasi yang cukup, tampaknya saya tidak dapat mengomentari tautan yang sangat bagus dari Alexander. - Lucene tampaknya menjadi satu-satunya solusi yang bekerja dalam kasus-kasus yang cukup umum.
Bagi mereka yang menginginkan solusi salin-tempel sederhana, ini dia, memanfaatkan kode di Lucene:
string testbed = "ÁÂÄÅÇÉÍÎÓÖØÚÜÞàáâãäåæçèéêëìíîïðñóôøøüüāăčĐęğıŁłńŌōřŞşšźžșțệủ";
Console.WriteLine (Lucene.latinizeLucene (testbed));
//////////
sumber