Канал Windows cmd не поддерживает Юникод даже с переключателем /U

StackOverflow https://stackoverflow.com/questions/285486

  •  08-07-2019
  •  | 
  •  

Вопрос

У меня есть небольшая консольная программа С#, которая выводит текст с помощью 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top