控制批量创建文件的编码

Pet*_*ner 6 batch utf-8

我想在 Windows 10 中自动创建目录树文件​​。

在 PowerShell 中,我执行了以下命令:

cd  C:\TreeTest
tree /f > .\TreeStructure.txt
Run Code Online (Sandbox Code Playgroud)

输出是一个漂亮的 UTF-8 文件:

漂亮的UTF-8树结构测试

现在我想在批处理文件中做同样的事情:

@echo off
cd  C:\TreeTest
tree /f > .\TreeStructure.txt
Run Code Online (Sandbox Code Playgroud)

但是批处理文件执行的输出的编码搞砸了:

错误的编码树结构测试

为什么 PowerShell 输出的编码与批处理文件的输出不同?

我知道可以通过将 /a 添加到 tree 命令来获得 ASCII 输出,但我更喜欢将漂亮的 UTF-8 输出保存到我​​的树文件中。

我尝试通过将“chcp 65001”添加到我的批处理文件中来更改代码页,但它没有更改文件输出。

Lot*_*ngs 5

您错误地假设您的编辑器Notepad++将 PowerShell 中创建的文件读取为 UTF8。

UTF16-LE/UCS-2 LE-BOMBOM 0xFF 0xFE

在 cmd.exe 中创建的树文件在 actice 代码页中进行编码,请参阅 的输出chcp 并相应地更改编码Notepad++

> chcp
Aktive Codepage: 850.
Run Code Online (Sandbox Code Playgroud)

更改编码(在我的德语语言环境 Notepad++ 中):

在此输入图像描述


Jos*_*efZ 3

LotPing的回答是正确的。只是为了详细描述:

\n

重定向运算符>将指定的流发送到文件):

\n
    \n
  • Windows PowerShell中,输出文件的默认编码是UCS-2 LE BOM
  • \n
\n
\n

当您写入文件时,重定向运算符使用Unicode\n编码。如果文件具有不同的编码,\n输出的格式可能不正确。要将内容重定向到非 Unicode 文件,请使用\ncmdletOut-File及其Encoding参数。1

\n

1复制粘贴,因为在线文档Get-Help about_Redirection -ShowWindow中有错误

\n
\n
    \n
  • PowerShell Core中:从PowerShell 6开始,写入文件时默认编码更改为BOM-less UTF-8 :
  • \n
\n
\n

当您写入文件时,重定向运算符使用\nUTF8NoBOM编码。

\n
\n
    \n
  • 在Windows 命令提示符 ( cmd.exe)中:
  • \n
  • cmd.exe(默认):内部命令到管道或文件的输出是OEM
  • \n
  • cmd.exe /A:导致内部命令输出到管道或文件ANSI,并且
  • \n
  • cmd.exe /U:导致内部命令到管道或文件的输出为Unicode,即UCS-2 LE(否BOM):
  • \n
\n
\n

ShellCMD可以重定向OEM// ANSIUnicode\n( UCS-2 le) 但不能UTF-8。可以通过启动\n或或
来选择此选项。CMDCMD /ACMD /U

\n
\n

但是,相当老式的实用程序的输出tree.com尚未准备好转换为 Unicode。因此,straightstart "" cmd /U /C "tree>tree_U.txt"仍然会产生(mojibake)乱码(OEM编码文件解释为ANSI)。以下cmd命令应该可以解决问题:

\n
tree>"%temp%\\auxTree.txt"\nstart "" cmd /U /C "type "%temp%\\auxTree.txt">tree_Unicode.txt"\ndel "%temp%\\auxTree.txt"\n
Run Code Online (Sandbox Code Playgroud)\n

顺便说一句,这里是那些漂亮的字符和他们的代码(乱码ANSI):

\n
Char Unicode  OEM  ANSI  UTF-8     Character_description\n \xe2\x94\x80   U+2500   196  n/a   0xE29480  Box Drawings Light Horizontal\n \xe2\x94\x82   U+2502   179  n/a   0xE29482  Box Drawings Light Vertical\n \xe2\x94\x94   U+2514   192  n/a   0xE29494  Box Drawings Light Up And Right\n \xe2\x94\x9c   U+251C   195  n/a   0xE2949C  Box Drawings Light Vertical And Right\n
Run Code Online (Sandbox Code Playgroud)\n

以及mojibake大小写机制(Python 中的示例,以实现其常见的可理解性):

\n
\' \xe2\x94\x80 \xe2\x94\x82 \xe2\x94\x94 \xe2\x94\x9c \'.encode(\'cp437\').decode(\'cp1252\')\n
Run Code Online (Sandbox Code Playgroud)\n
\n
\' \xc3\x84 \xc2\xb3 \xc3\x80 \xc3\x83 \'\n
Run Code Online (Sandbox Code Playgroud)\n
\n


归档时间:

查看次数:

19854 次

最近记录:

3 年,4 月 前