/ / “???” символи при запазване на Unicode файлове в C # - c #, unicode

"???" символи при запаметяване на файлове с unicode в C # - c #, unicode

Имам някои проблеми, когато записвам конфигурация- Unicode текстът се запазва като "???". Но проблемът се появява само на Windows 2003 с .Net Framework v 2. Когато тествам кода на WinXP с .Net 4, той работи добре, въпреки че е насочен към .Net Framework v2 в настройките. Опитах се да правя различни реализации като

Encoding.ASCII.GetString(
Encoding.Convert(Encoding.ASCII,
Encoding.Unicode,
Encoding.Unicode.GetBytes(backupPathTextBox.Text)));

Но тя винаги се връща "???"или някои нечетими символи. Проучих този въпрос и установих, че всички C # низове, представени в кодова страница UTF16, но няма UTF16 декодер в C #. Може ли някой да ме води в правилната посока?

Отговори:

4 за отговор № 1
Encoding.ASCII.GetString(
Encoding.Convert(Encoding.ASCII,
Encoding.Unicode,
Encoding.Unicode.GetBytes(backupPathTextBox.Text)));

Encoding.Unicode всъщност е кодирането UTF-16LE, където всекикодовата единица се съхранява с два байта (и така ASCII символите завършват с нула байта между тях). Microsoft нарича това "Unicode", защото те са очаквали да бъдат използвани като най-разпространеното кодиране на Unicode още в ранните дни, но не се получи така и сега името е напълно подвеждащо.

Вашият код прави:

  • преобразува вашия текстов низ в UTF-16LE байта;

  • след това ги конвертира от ASCII байтове (които не са) в UTF-16LE байта, което означава, че допълнителен нулев байт се добавя между всеки байт;

  • след това превръща тези байтове обратно в низ катоте бяха ASCII, което означава, че ще получите по същество същия низ, с който трябваше да започнете, но с още три нула байта на един символ, а не-ASCII символите се превърнаха в две.

Какво точно се опитвахте да направите с това? Ако искате да поставите Unicode низ в ASCII-съвместим текстов файл, кодирането, което искате, е обикновено utf-8 и никога UTF-16. Конвертирането на низ в utf-8 байта е толкова просто, колкото:

new UTF8Encoding(false).GetBytes(backupPathTextBox.Text)

или просто използвайте utf-8 TextWriter да напишете низ директно.