Semuanya tergantung
Membandingkan string unicode sulit:
Implementasi pencarian string Unicode dan perbandingan dalam perangkat lunak pemrosesan teks harus memperhitungkan keberadaan poin kode yang setara. Dengan tidak adanya fitur ini, pengguna yang mencari urutan titik kode tertentu tidak akan dapat menemukan mesin terbang lain yang secara visual tidak dapat dibedakan yang memiliki representasi titik kode yang berbeda, tetapi secara kanonik, berbeda.
lihat: http://en.wikipedia.org/wiki/Unicode_equivalence
Jika Anda mencoba membandingkan 2 string unicode dengan case case insensitive dan ingin itu bekerja di MANA SAJA , Anda memiliki masalah yang mustahil.
Contoh klasiknya adalah bahasa Turki i , yang ketika huruf besar menjadi İ (perhatikan titik)
Secara default, framework .Net biasanya menggunakan CurrentCulture untuk fungsi terkait string, dengan pengecualian yang sangat penting .Equals
yang menggunakan perbandingan ordinal (byte by byte).
Ini mengarah, dengan desain, ke berbagai fungsi string berperilaku berbeda tergantung pada budaya komputer.
Meskipun demikian, kadang-kadang kita menginginkan "tujuan umum", case-sensitive, perbandingan.
Misalnya, Anda mungkin ingin perbandingan string Anda berperilaku dengan cara yang sama, apa pun komputer tempat aplikasi Anda diinstal.
Untuk mencapai ini kami memiliki 3 opsi:
- Tetapkan budaya secara eksplisit dan lakukan perbandingan kasus yang tidak sensitif menggunakan aturan kesetaraan unicode.
- Atur budaya ke Budaya Invariant dan lakukan perbandingan kasus dengan menggunakan aturan kesetaraan unicode.
- Gunakan OrdinalIgnoreCase yang akan memperbesar string menggunakan InvariantCulture dan kemudian melakukan perbandingan byte demi byte.
Aturan kesetaraan Unicode rumit, yang berarti menggunakan metode 1) atau 2) lebih mahal daripada OrdinalIgnoreCase
. Fakta yang OrdinalIgnoreCase
tidak melakukan normalisasi unicode khusus, berarti bahwa beberapa string yang merender dengan cara yang sama di layar komputer, tidak akan dianggap identik. Misalnya: "\u0061\u030a"
dan "\u00e5"
keduanya membuat å. Namun dalam perbandingan ordinal akan dianggap berbeda.
Yang Anda pilih sangat tergantung pada aplikasi yang Anda buat.
- Jika saya sedang menulis aplikasi lini bisnis yang hanya digunakan oleh pengguna Turki, saya pasti akan menggunakan metode 1.
- Jika saya hanya perlu membandingkan kasus sederhana "palsu" tidak sensitif, untuk mengatakan nama kolom dalam db, yang biasanya bahasa Inggris saya mungkin akan menggunakan metode 3.
Microsoft memiliki serangkaian rekomendasi mereka dengan pedoman eksplisit. Namun, sangat penting untuk memahami gagasan kesetaraan unicode sebelum mendekati masalah ini.
Juga, harap diingat bahwa OrdinalIgnoreCase adalah jenis binatang yang sangat istimewa , yaitu mengambil dan memilih sedikit ordinal dibandingkan dengan beberapa campuran dalam aspek leksikografis. Ini bisa membingungkan.