Канал Windows cmd не поддерживает Юникод даже с переключателем /U
Вопрос
У меня есть небольшая консольная программа С#, которая выводит текст с помощью Console.WriteLine.Затем я передаю этот вывод в текстовый файл, например:
c:myprogram > textfile.txt
Однако файл всегда является текстовым файлом в формате ansi, даже когда я запускаю cmd с ключом /u.смд /?говорит о переключателе /u:
/U Вызывает выход внутреннего команды к каналу или файлу, которые должны быть Unicode
И это действительно имеет значение, когда я делаю
c:echo "foo" > text.txt
text.txt имеет формат Unicode (без спецификации)
Интересно, почему передача вывода моей консольной программы в новый файл также не создает файл Unicode и как я могу это изменить?
Я просто использую Windows Power Shell (которая создает файл Unicode с правильной спецификацией), но мне все равно хотелось бы знать, как это сделать с помощью cmd.
Спасибо!
Решение
Переключатель /U, как сказано в документации, влияет на то, внутренний команды генерируют вывод в формате Unicode.Ваша программа не является одной из внутренних команд cmd.exe, поэтому параметр /U на нее не влияет.
Чтобы создать текстовый файл в формате Unicode, вам необходимо убедиться, что ваша программа генерирует текст в формате Unicode.
Хотя даже этого может быть недостаточно.я наткнулся этот блог от Цзюньфэн Чжана описывающее, как писать текст Unicode в консольной программе.Он проверяет тип файла стандартного дескриптора вывода.Для символьных файлов (консольный или LPT-порт) он вызывает WriteFileW.Для всех других типов дескрипторов (включая дисковые файлы и каналы) он преобразует выходную строку в текущую кодовую страницу консоли.Боюсь, я не знаю, как это перевести в термины .Net.
Другие советы
Я посмотрел, как mscorlib реализует Console.WriteLine, и, похоже, он решает, какую кодировку вывода текста использовать на основе вызова GetConsoleOutPutCP.Итак, я предполагаю (но еще не подтвердил), что возвращаемая кодовая страница отличается для консоли PS от консоли cmd, так что моя программа действительно выводит ansi только при запуске из cmd.