Так что я прочитал статью Спольского дважды, этот вопрос тоже и много пробовал. Теперь я здесь.
Я создал архив структуры каталогов на Linux машине с локалью ISO-8859-1 и распаковал ее на Windows с помощью 7zip. В результате имена файлов зашифровываются, когда я просматриваю их в Windows Explorer (и в моей программе C# тоже): где я ожидаю увидеть немецкий умляут ü
это ³
- Не удивительно, поскольку имена файлов записываются в файл tar с использованием кодовой страницы ISO-8859-1, а Windows явно не знает об этом.
Я хочу исправить это, переименовав файлы в их правильные имена. Поэтому я думаю, что должен сказать программе «прочитайте имя файла, подумайте о нем как об ISO-8859-1 и верните каждый символ как символ UTF-16».
Мой код, чтобы найти правильное имя файла:
void Main()
{
string[] files = Directory.GetFiles(@"C:\test", @"*", SearchOption.AllDirectories);
var e1 = Encoding.GetEncoding("ISO-8859-1");
var e2 = Encoding.GetEncoding("UTF-16");
foreach (var f in files)
{
Console.WriteLine($"Source: {f}");
var source = e1.GetBytes(f);
var dest = Encoding.Convert(e1, e2, source);
Console.WriteLine($"Result: {e2.GetString(dest)}");
}
}
Результат - ничего не произошло:
Source: C:\test\Brief-mrl³.odt
Result: C:\test\Brief-mrl³.odt
Ожидаемый результат:
Source: C:\test\Brief-mrl³.odt
Result: C:\test\Brief-mrlü.odt
Когда я обмениваю e1 и e2, я получаю странные результаты. Мой мозг болит. Что я не получаю?
Редактировать: Я знаю, что ошибка была сделана ранее, но сейчас У меня неправильные имена файлов на компьютере Windows, который я надо исправить. Однако, это может быть не решаемо через класс Encoding
. Я нашел это сообщение в блоге и автор заявляет
Оказывается, это не проблема с кодировкой вообще, но один и тот же адрес символа означает разные вещи для разных наборы символов.
В заключение он написал метод замены символов от 130 до 173 на указанные c, различные символы. Это не выглядит простым для меня, но возможно ли, что это единственный путь? Кто-нибудь может прокомментировать это, пожалуйста?