Saya bingung dengan masalah mengonversi string (yang saya asumsikan dalam UTF-16/Unicode) dalam C # untuk menghasilkan file menggunakan pengkodean ISO-8859-1.

string s = "Gibt es ein Restaurant in der Nähe";
Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding unicode = Encoding.Unicode;
byte[] unicodeBytes = Encoding.Unicode.GetBytes(s);
byte[] isoBytes = Encoding.Convert(unicode, iso, unicodeBytes);

// convert the new byte[] to char[]
char[] isoChars = new char[iso.GetCharCount(isoBytes, 0, isoBytes.Length)];
iso.GetChars(isoBytes, 0, isoBytes.Length, isoChars, 0);

StreamWriter sw = new StreamWriter(output, iso);
sw.Write(isoChars, 0, isoChars.Length);
sw.Write(Environment.NewLine, 0, Environment.NewLine.Length); '

File teks keluaran saya menunjukkan teks dengan tanda tanya:

Restoran Gibt es ein di der N?he

1
Neil 29 September 2021, 19:11

2 jawaban

Jawaban Terbaik

Satu hal yang perlu dipahami di sini adalah string dan karakter .Net SELALU dikodekan menggunakan pengkodean internal .Net (UTF-16 atau halaman kode sistem untuk Framework dan UTF-8 untuk Core). Oleh karena itu, menerjemahkan larik byte yang diekspor ke penyandian baru dan memuat kembali ke char[] tidak akan membantu Anda jika Anda memerlukan penyandian tertentu. Sebaliknya, Anda harus menulis byte.

Namun, menggunakan penyandian yang benar dengan StreamWriter itu sendiri harus menangani semua yang Anda butuhkan, artinya Anda harus dapat menyederhanakan kode seperti ini:

string s = "Gibt es ein Restaurant in der Nähe";
Encoding iso = Encoding.GetEncoding("iso-8859-1");
using (var sw = new StreamWriter(output, iso))
{
    sw.WriteLine(s);
}

Terakhir, dalam mengamati hasilnya, pastikan untuk menggunakan editor teks yang akan memahami pengkodean yang dipilih. Dimungkinkan untuk melakukan semuanya dengan benar, tetapi lihat karakter buruknya jika Anda memeriksanya di editor atau font yang tidak tahu cara menampilkan mesin terbang itu.

3
Joel Coehoorn 29 September 2021, 19:52

Mengapa Anda mengonversi byte menjadi karakter? Anda tidak harus melakukannya kecuali Anda akan menggunakan karakter di tempat lain.

Ini bekerja untuk saya:

        string s = "Gibt es ein Restaurant in der Nähe";
        Encoding iso = Encoding.GetEncoding("ISO-8859-1");
        Encoding unicode = Encoding.Unicode;
        byte[] unicodeBytes = unicode.GetBytes(s);
        byte[] isoBytes = Encoding.Convert(unicode, iso, unicodeBytes);

        // convert the new byte[] to char[]
        //char[] isoChars = new char[iso.GetCharCount(isoBytes, 0, isoBytes.Length)];
        //iso.GetChars(isoBytes, 0, isoBytes.Length, isoChars, 0);

        StreamWriter sw = new StreamWriter(output, iso);
        sw.Write(iso.GetString(isoBytes));
0
Sebastian Siemens 29 September 2021, 16:40