控制批量创建文件的编码

控制批量创建文件的编码

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

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

cd  C:\TreeTest
tree /f > .\TreeStructure.txt

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

漂亮的 UTF-8 树结构测试

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

@echo off
cd  C:\TreeTest
tree /f > .\TreeStructure.txt

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

糟糕的编码树结构测试

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

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

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

答案1

LotPing 的回答是正确的。仅供详细说明:

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

  • Windows PowerShell,输出文件的默认编码是UCS-2 LE 物料清单

当你写入文件时,重定向操作符使用Unicode 编码。如果文件具有不同的编码,则输出格式可能不正确。要将内容重定向到非 Unicode 文件,请使用Out-File带有其Encoding参数的cmdlet。1

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

  • PowerShell 核心: 开始于PowerShell 6,默认编码改为无 BOM 的 UTF-8写入文件时:

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

  • Windows 命令提示符 ( cmd.exe)
  • cmd.exe(默认):内部命令到管道或文件的输出是OEM
  • cmd.exe /A:导致内部命令到管道或文件的输出ANSI, 和
  • cmd.exe /U:导致内部命令到管道或文件的输出统一码UCS-2 LE(否BOM):

ShellCMD可以重定向OEM/ ANSI/Unicode ( UCS-2 le) 但不能UTF-8
可以通过启动 CMDCMD /A或来选择CMD /U

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

tree>"%temp%\auxTree.txt"
start "" cmd /U /C "type "%temp%\auxTree.txt">tree_Unicode.txt"
del "%temp%\auxTree.txt"

顺便说一下,这些是漂亮的字符及其代码(乱码ANSI):

Char Unicode  OEM  ANSI  UTF-8     Character_description
 ─   U+2500   196  n/a   0xE29480  Box Drawings Light Horizontal
 │   U+2502   179  n/a   0xE29482  Box Drawings Light Vertical
 └   U+2514   192  n/a   0xE29494  Box Drawings Light Up And Right
 ├   U+251C   195  n/a   0xE2949C  Box Drawings Light Vertical And Right

还有莫吉巴克大小写机制(以 Python 为例,以方便理解):

' ─ │ └ ├ '.encode('cp437').decode('cp1252')
' Ä ³ À Ã '

答案2

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

它是UTF16-LE/UCS-2 LE-BOM带有物料清单 0xFF 0xFE

在 cmd.exe 中创建的树文件在活动代码页中编码,请查看输出chcp 并相应地更改编码Notepad++

> chcp
Aktive Codepage: 850.

更改编码(在我的德语区域设置 Notepad++ 中):

在此处输入图片描述

相关内容