Oke, di .Net dan C # semua string dikodekan sebagai UTF-16LE . A string
disimpan sebagai urutan karakter. Setiap char
mengenkapsulasi penyimpanan 2 byte atau 16 bit.
Apa yang kita lihat "di atas kertas atau layar" sebagai satu huruf, karakter, mesin terbang, simbol, atau tanda baca dapat dianggap sebagai Elemen Teks tunggal. Seperti yang dijelaskan dalam Unicode Standard Annex # 29 UNICODE SEGMENTATION TEXT , setiap Elemen Teks diwakili oleh satu atau lebih Poin Kode. Daftar lengkap Kode dapat ditemukan di sini .
Setiap Poin Kode perlu dikodekan ke dalam biner untuk representasi internal oleh komputer. Seperti yang dinyatakan, masing-masing char
menyimpan 2 byte. Poin Kode pada atau di bawah U+FFFF
ini dapat disimpan dalam satu char
. Poin Kode di atas U+FFFF
disimpan sebagai pasangan pengganti, menggunakan dua karakter untuk mewakili satu Poin Kode.
Mengingat apa yang kita ketahui sekarang dapat kita simpulkan, Elemen Teks dapat disimpan sebagai satu char
, sebagai Pasangan Pengganti dari dua karakter atau, jika Elemen Teks diwakili oleh beberapa Poin Kode beberapa kombinasi karakter tunggal dan Pasangan Pengganti. Seolah-olah itu tidak cukup rumit, beberapa Elemen Teks dapat diwakili oleh berbagai kombinasi Poin Kode seperti yang dijelaskan dalam, Unicode Standard Annex # 15, FORMULIR NORMALISASI UNICODE .
Selingan
Jadi, string yang terlihat sama ketika diberikan sebenarnya dapat terdiri dari kombinasi karakter yang berbeda. Suatu perbandingan ordinal (byte demi byte) dari dua string semacam itu akan mendeteksi perbedaan, ini mungkin tidak terduga atau tidak diinginkan.
Anda bisa menyandikan ulang string .Net. sehingga mereka menggunakan Formulir Normalisasi yang sama. Setelah dinormalisasi, dua string dengan Elemen Teks yang sama akan dikodekan dengan cara yang sama. Untuk melakukan ini, gunakan fungsi string . Normalisasi . Namun, ingat, beberapa Elemen Teks yang berbeda terlihat mirip satu sama lain. : -s
Jadi, apa artinya semua ini dalam kaitannya dengan pertanyaan? Elemen Teks '𠈓'
diwakili oleh satu Code Point U + 20213 cjk unified ideaographs extension b . Ini berarti tidak dapat dikodekan sebagai tunggal char
dan harus dikodekan sebagai Pasangan Pengganti, menggunakan dua karakter. Inilah sebabnya mengapa string b
satu char
lagi itu string a
.
Jika Anda perlu andal (lihat peringatan) hitung jumlah Elemen Teks dalam string
Anda harus menggunakan
System.Globalization.StringInfo
kelas seperti ini.
using System.Globalization;
string a = "abc";
string b = "A𠈓C";
Console.WriteLine("Length a = {0}", new StringInfo(a).LengthInTextElements);
Console.WriteLine("Length b = {0}", new StringInfo(b).LengthInTextElements);
memberikan output,
"Length a = 3"
"Length b = 3"
seperti yang diharapkan.
Peringatan
Implementasi .Net Segmentasi Teks Unicode di dalam StringInfo
dan TextElementEnumerator
kelas harus umumnya bermanfaat dan, dalam banyak kasus, akan menghasilkan respons yang diharapkan oleh penelepon. Namun, seperti yang dinyatakan dalam Unicode Standard Annex # 29, "Tujuan pencocokan persepsi pengguna tidak selalu dapat dipenuhi persis karena teks saja tidak selalu berisi informasi yang cukup untuk menentukan batas secara jelas."