Имам някои проблеми, когато записвам конфигурация- 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 за отговор № 1Encoding.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
да напишете низ директно.