Saya telah mencari di Google tentang topik ini dan saya telah melihat setiap jawaban, tetapi saya masih belum mengerti.
Pada dasarnya saya perlu mengubah string UTF-8 menjadi ISO-8859-1 dan saya melakukannya dengan menggunakan kode berikut:
Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
string msg = iso.GetString(utf8.GetBytes(Message));
String sumber saya adalah
Message = "ÄäÖöÕõÜü"
Tapi sayangnya string hasil saya menjadi
msg = "�ä�ö�õ�ü
Apa yang saya lakukan salah di sini?
Encoding.Unicode
dan di Win32 API. Unicode adalah himpunan karakter, bukan penyandiaksaraan. UTF-16 adalah salah satu dari beberapa penyandiaksaraan untuk Unicode.)Message
diterjemahkan dari UTF-8. Dengan asumsi bagian itu bekerja dengan benar, mengonversi ke Latin-1 semudahbyte[] bytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(Message)
. Kemudian, seperti yang dikatakan StuS, Anda dapat mengonversi Latin-1 byte kembali ke UTF-16 denganEncoding.GetEncoding("ISO-8859-1").GetString(bytes)
Jawaban:
Gunakan Encoding.Convert untuk menyesuaikan array byte sebelum mencoba mendekodekannya menjadi pengkodean tujuan Anda.
sumber
Encoding.GetEncoding("ISO-8859-1").GetString(Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("ISO-8859-1"), Encoding.UTF8.GetBytes(myString)))
Saya pikir masalah Anda adalah Anda berasumsi bahwa byte yang mewakili string utf8 akan menghasilkan string yang sama ketika ditafsirkan sebagai sesuatu yang lain (iso-8859-1). Dan bukan itu masalahnya. Saya menyarankan Anda membaca artikel yang sangat bagus ini oleh Joel spolsky.
sumber
Coba ini:
sumber
Anda harus memperbaiki sumber string di tempat pertama.
Sebuah string dalam .NET sebenarnya hanyalah sebuah array dari kode-poin unicode 16-bit, karakter, jadi string tidak ada dalam pengkodean tertentu.
Saat Anda mengambil string itu dan mengubahnya menjadi satu set byte, encoding mulai bekerja.
Bagaimanapun, cara Anda melakukannya, menyandikan string ke array byte dengan satu set karakter, dan kemudian mendekodekannya dengan yang lain, tidak akan berfungsi, seperti yang Anda lihat.
Dapatkah Anda memberi tahu kami lebih lanjut tentang dari mana string asli itu berasal, dan mengapa menurut Anda kode itu salah?
sumber
Sepertinya kode agak aneh. Untuk mendapatkan string dari aliran byte Utf8, yang perlu Anda lakukan adalah:
Jika Anda perlu menyimpan aliran iso-8859-1 byte ke suatu tempat, cukup gunakan: baris kode tambahan untuk sebelumnya:
sumber
Baru saja menggunakan solusi Nathan dan berfungsi dengan baik. Saya perlu mengonversi ISO-8859-1 ke Unicode:
sumber
sumber
Berikut adalah contoh untuk ISO-8859-9;
sumber