/ / "???" символи при збереженні файлів 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 писати рядок безпосередньо.