труба windows cmd не unicode даже с ключом / U - PullRequest
7 голосов
/ 13 ноября 2008

У меня есть небольшая консольная программа на c #, которая выводит некоторый текст с помощью Console.WriteLine. Затем я передаю этот вывод в текстовый файл, например:

c:myprogram > textfile.txt

Однако этот файл всегда является текстовым файлом ANSI, даже когда я запускаю cmd с ключом / u. cmd /? говорит о переключателе / ​​u:

/ U Вызывает выход внутреннего команды для канала или файла в Unicode

И это действительно имеет значение, когда я делаю

c:echo "foo" > text.txt

text.txt является Unicode (без спецификации)

Интересно, почему передача вывода моей консольной программы в новый файл также не создает файл Unicode, и как я могу это изменить?

Я просто использую оболочку Windows Power (которая создает файл в кодировке Юникод с правильной спецификацией), но я все же хотел бы знать, как это сделать с помощью cmd.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 13 ноября 2008

Параметр / U, как сказано в документации, влияет на то, генерируют ли внутренние команды вывод Unicode. Ваша программа не является одной из внутренних команд cmd.exe, поэтому параметр / U на нее не влияет.

Чтобы создать текстовый файл Unicode, вы должны убедиться, что ваша программа генерирует текст Unicode.

Даже этого может быть недостаточно. Я наткнулся на этот блог от Junfeng Zhang , описывающий, как писать текст Unicode в консольной программе. Он проверяет тип файла стандартного дескриптора вывода. Для файлов символов (консоль или порт LPT) он вызывает WriteFileW. Для всех других типов дескрипторов (включая дисковые файлы и каналы) он преобразует строку вывода в текущую кодовую страницу консоли. Боюсь, я не знаю, как это выражается в терминах .Net.

2 голосов
/ 13 ноября 2008

Я посмотрел, как mscorlib реализует Console.WriteLine, и, похоже, он решает, какую кодировку вывода текста использовать, основываясь на вызове GetConsoleOutPutCP . Так что я предполагаю (но пока не признал), что возвращаемая кодовая страница отличается для консоли PS от консоли cmd, так что моя программа действительно выводит ansi только при запуске из cmd.

...