ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Windows 命令行中使用 unicode 字符?

我们在 Team Foundation Server (TFS) 中有一个项目,其中包含非英文字符 (š)。在尝试编写一些与构建相关的内容时,我们偶然发现了一个问题——我们无法将 š 字母传递给命令行工具。命令提示符或其他什么都搞砸了,tf.exe 实用程序找不到指定的项目。

我尝试了 .bat 文件的不同格式(ANSI、UTF-8 有和没有 BOM)以及用 JavaScript 编写脚本(本质上是 Unicode) - 但没有运气。如何执行一个程序并传递一个 Unicode 命令行?

@JohannesDewender - 复制粘贴出错了?
Python 3.6:“Windows 上的默认控制台接受该版本的所有 Unicode 字符”(嗯,大部分对我来说)但是您需要配置控制台:右键单击窗口顶部(cmd 或 python IDLE ),在默认/字体中选择“Lucida 控制台”。
@LưuVĩnhPhúc - 不,这是关于传递 unicode 命令行参数,而不是在控制台中显示文本。控制台可能根本不参与。

k
kgiannakakis

尝试:

chcp 65001

这会将代码页更改为 UTF-8。此外,您需要使用 Lucida 控制台字体。


您知道是否有办法将其设为默认值?
请注意,Windows 的代码页 65001 支持中存在严重的实现错误,这将破坏许多依赖 C 标准库 IO 方法的应用程序,因此这是非常脆弱的。 (批处理文件也只是在 65001 中停止工作。)不幸的是,UTF-8 在 Windows 中是二等公民。
@bobince 您是否有 Windows 代码页 65001 支持中的错误示例?我很好奇,因为我从来没有遇到过,而且谷歌搜索也没有发现任何问题。 (当然,批处理文件确实停止工作,但 UTF-8 几乎不是二等公民......)
@romkyns:我的理解是返回字节数的调用(例如 fread/fwrite/etc)实际上返回了字符数。这会导致各种各样的症状,例如输入读取不完整、fflush 挂起、批处理文件损坏等。 Some background. 用于 CJK“多字节”语言环境的默认代码页具有内置的特殊处理来解决此问题,但 65001 没有 - 它是 not supported
不过,这里有一个有趣的问题——错误是因为它应该报告字节而不是报告字符——还是因为使用它的应用程序错误地假设了字节=字符?换句话说,是 API 失败还是 API 使用失败?
I
Ilya Zakharevich

我的背景:多年来,我在控制台中使用 Unicode 输入/输出(并且每天都这样做。此外,我为这个任务开发了支持工具)。就您了解以下事实/限制而言,问题很少:

CMD 和“控制台”是不相关的因素。 CMD.exe 只是准备在控制台“内部工作”的程序之一(“控制台应用程序”)。

AFAIK,CMD 完美支持 Unicode;当任何代码页处于活动状态时,您可以输入/输出所有 Unicode 字符。

Windows 的控制台对 Unicode 有很多支持——但它并不完美(只是“足够好”;见下文)。

chcp 65001 非常危险。除非某个程序是专门为解决 Windows API 中的缺陷而设计的(或使用具有这些解决方法的 C 运行时库),否则它不会可靠地工作。 Win8 用 cp65001 修复了其中的 1/2 个问题,但其余的仍然适用于 Win10。

我在cp1252工作。正如我已经说过的:要在控制台中输入/输出 Unicode,不需要设置代码页。

细节

要将 Unicode 读/写到控制台,应用程序(或其 C 运行时库)应该足够智能,不使用 File-I/O API,而是使用 Console-I/O API。 (例如,看看 Python 是如何做到的。)

同样,要读取 Unicode 命令行参数,应用程序(或其 C 运行时库)应该足够智能以使用相应的 API。

控制台字体渲染仅支持 BMP 中的 Unicode 字符(换句话说:低于 U+10000)。仅支持简单的文本呈现(因此欧洲语言——和一些东亚语言——应该可以正常工作——只要使用预先组合的形式)。 [这里对东亚和字符 U+0000、U+0001、U+30FB 有一个小字体。]

实际考虑

Window 上的默认值不是很有帮助。为获得最佳体验,应调整 3 项配置: 对于输出:综合控制台字体。为了获得最佳效果,我推荐我的构建。 (安装说明在那里 - 并且也在此页面上的其他答案中列出。)对于输入:功能强大的键盘布局。为了获得最佳效果,我推荐我的布局。对于输入:允许 Unicode 的 HEX 输入。

用于输出:综合控制台字体。为了获得最佳效果,我推荐我的构建。 (安装说明在那里 - 并且也在此页面上的其他答案中列出。)

对于输入:有能力的键盘布局。为了获得最佳效果,我推荐我的布局。

对于输入:允许 Unicode 的 HEX 输入。

将“粘贴”到控制台应用程序的另一个问题(非常技术性):HEX 输入在 Alt 的 KeyUp 上传递一个字符;所有其他传递角色的方式都发生在 KeyDown 上;如此多的应用程序还没有准备好在 KeyUp 上看到一个字符。 (仅适用于使用 Console-I/O API 的应用程序。) 结论:许多应用程序不会对 HEX 输入事件做出反应。此外,“粘贴”字符会发生什么取决于当前的键盘布局:是否可以在不使用前缀键的情况下键入字符(但可以使用任意复杂的修饰符组合,如 Ctrl-Alt-AltGr-Kana-Shift-Gray* ) 然后它通过模拟按键传递。这是任何应用程序所期望的——因此粘贴仅包含此类字符的任何内容都可以。但是,“其他”字符是通过模拟 HEX 输入来传递的。结论:除非您的键盘布局支持输入大量没有前缀键的字符,否则当您通过控制台的 UI 粘贴时,一些有问题的应用程序可能会跳过字符:Alt-Space E P。(这就是为什么我建议使用我的键盘布局!)

HEX 输入在 Alt 的 KeyUp 上传递一个字符;所有其他传递角色的方式都发生在 KeyDown 上;如此多的应用程序还没有准备好在 KeyUp 上看到一个字符。 (仅适用于使用 Console-I/O API 的应用程序。)

结论:许多应用程序不会对 HEX 输入事件做出反应。

此外,“粘贴”字符会发生什么取决于当前的键盘布局:是否可以在不使用前缀键的情况下键入字符(但可以使用任意复杂的修饰符组合,如 Ctrl-Alt-AltGr-Kana-Shift-Gray* ) 然后它通过模拟按键传递。这是任何应用程序所期望的——因此粘贴仅包含此类字符的任何内容都可以。

但是,“其他”字符是通过模拟 HEX 输入来传递的。

还应该记住,Windows 的“替代的、'功能更强大'的控制台”根本不是控制台。它们不支持 Console-I/O API,因此依赖这些 API 工作的程序将无法运行。 (不过,仅使用“控制台文件句柄的 File-I/O API”的程序可以正常工作。)

此类非控制台的一个示例是 Microsoft 的 Powershell 的一部分。我不用这个;要进行实验,请按下并松开 WinKey,然后键入 powershell

(另一方面,诸如 ConEmuANSICON 之类的程序试图做更多的事情:它们“试图”拦截 Console-I/O API 以使“真正的控制台应用程序”也能工作。这绝对适用于玩具示例程序;在现实生活中,这可能会或可能不会解决您的特定问题。实验。)

概括

设置字体、键盘布局(并且可选地,允许 HEX 输入)。

仅使用通过 Console-I/O API 并接受 Unicode 命令行参数的程序。例如,任何 cygwin 编译的程序都应该没问题。正如我已经说过的,CMD 也很好。

UPD: 最初,对于 cp65001 中的一个错误,我混合了内核和 CRTL 层(UPD²: 和 Windows 用户模式 API!)。 另外: Win8 修复了这个 bug 的一半;我澄清了关于“更好的控制台”应用程序的部分,并添加了对 Python 是如何做到这一点的参考。


好的,对于如此彻底的事情,您应该成为公认的答案!惊人的!
我是 C++ 的新手,仔细阅读后无法理解这个答案。有人可以帮我解决这个问题或做出更简单的解释吗?
@Bachi 感谢 Bachi,我发现我的键盘布局(上面提到的)的 v73 缺少一些支持文件。现在修好了! (从我的 .log 文件来看,这是 zip -ru [?!] 中的一个间歇性错误。不知道如何调试它 - 或者将来避免......)
@Rick:对!我在 Python 中添加了一个解决方法的链接(但我现在找不到补丁的直接链接……)。
控制台中的错误不在内核中。 kernel32.dll 和 kernelbase.dll 中的 API 通常与 ntdll.dll 导出的系统调用接口。控制台 API 最终会在 Windows 8+ 中进行 I/O 调用(例如 NtReadFileNtDeviceIoControlFile)或在旧版本中进行 LPC 调用。这些系统调用通过内核(例如通过 Win 8+ 中的 ConDrv 设备),但最终它们在用户模式控制台主机进程中实现。这是 Windows 7+ 中的 conhost.exe 实例,或者在旧版本中是会话子系统进程 csrss.exe。控制台错误通常在这里。
P
Peter Mortensen

我有同样的问题(我来自捷克共和国)。我有一个英文版的 Windows,我必须处理共享驱动器上的文件。文件的路径包括捷克语特有的字符。

对我有用的解决方案是:

在批处理文件中,更改字符集页面

我的批处理文件:

chcp 1250
copy "O:\VEŘEJNÉ\ŽŽŽŽŽŽ\Ž.xls" c:\temp

批处理文件必须保存在 CP 1250 中。

请注意,控制台不会正确显示字符,但它会理解它们......


干杯!我需要这个,以便我可以在批处理文件中输入版权字符。
在与您的情况几乎相同的情况下,这对我也很有效。相反,我的路径包含爱尔兰盖尔字符,即 áéíóú
@vanna 解决了我的“网络问题路径中的土耳其字符和空格”。你很棒。
您可能只需要使用不同的字体来正确显示字符,Lucida Console 为我工作。
“Windows-1250 是在 Microsoft Windows 下使用的代码页,用于表示使用拉丁脚本的中欧和东欧语言的文本,例如波兰语、捷克语、斯洛伐克语、匈牙利语、斯洛文尼亚语、波斯尼亚语、克罗地亚语、塞尔维亚语(拉丁脚本)、罗马尼亚语(在 1993 年拼写改革之前)和阿尔巴尼亚语。”
P
Peter Mortensen

检查非 Unicode 程序的语言。如果您在 Windows 控制台中遇到俄语问题,则应在此处设置俄语:

https://i.stack.imgur.com/45C5G.png


这不会在 cmd 中启用对 Unicode 的支持,它只会将默认代码页切换到仍然是 8 位字符集的 cp866。它甚至使用 cp866 而不是 cp1251,这增加了自己的麻烦。
有关较新 Windows 10 版本中的新选项,另请参阅下面的我的回答
W
Wernfried Domscheit

更改 Windows 控制台的默认代码页非常困难。当您在网上搜索时,您会发现不同的建议,但其中一些可能会完全破坏您的 Windows,即您的 PC 不再启动。

最安全的解决方案是:转到您的注册表项 HKEY_CURRENT_USER\Software\Microsoft\Command Processor 并添加字符串值 Autorun = chcp 65001

或者,您可以将这个小批处理脚本用于最常见的代码页。

@ECHO off

SET ROOT_KEY="HKEY_CURRENT_USER"


FOR /f "skip=2 tokens=3" %%i in ('reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage /v OEMCP') do set OEMCP=%%i

ECHO System default values:

ECHO.
ECHO ...............................................
ECHO Select Codepage 
ECHO ...............................................
ECHO.
ECHO 1 - CP1252
ECHO 2 - UTF-8
ECHO 3 - CP850
ECHO 4 - ISO-8859-1
ECHO 5 - ISO-8859-15
ECHO 6 - US-ASCII
ECHO.
ECHO 9 - Reset to System Default (CP%OEMCP%)
ECHO 0 - EXIT
ECHO.


SET /P  CP="Select a Codepage: "

if %CP%==1 (
    echo Set default Codepage to CP1252
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 1252>nul" /f
) else if %CP%==2 (
    echo Set default Codepage to UTF-8
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 65001>nul" /f
) else if %CP%==3 (
    echo Set default Codepage to CP850
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 850>nul" /f
) else if %CP%==4 (
    echo Set default Codepage to ISO-8859-1
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28591>nul" /f
) else if %CP%==5 (
    echo Set default Codepage to ISO-8859-15
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28605>nul" /f
) else if %CP%==6 (
    echo Set default Codepage to ASCII
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 20127>nul" /f
) else if %CP%==9 (
    echo Reset Codepage to System Default
    reg delete "%ROOT_KEY%\Software\Microsoft\Command Processor" /v AutoRun /f
) else if %CP%==0 (
    echo Bye
) else (
    echo Invalid choice
    pause
)

使用 @chcp 65001>nul 而不是 chcp 65001 会抑制输出“活动代码页:65001”,您每次启动新的命令行窗口时都会得到。

您可以从 Code Page Identifiers 获得的所有可用号码的完整列表

请注意,这些设置仅适用于当前用户。如果您想为所有用户设置它,请将第 SET ROOT_KEY="HKEY_CURRENT_USER" 行替换为 SET ROOT_KEY="HKEY_LOCAL_MACHINE"


好主意和有用的例子!
U
User

实际上,诀窍在于命令提示符实际上可以理解这些非英文字符,只是无法正确显示它们。

当我在命令提示符中输入包含一些非英语字符的路径时,它显示为“?? ?????? ?????”。当您提交命令时(在我的情况下 cd "??? ?????? ?????"),一切都按预期工作。


这可能有点危险,因为您可能会遇到命名冲突。例如,如果您有两个文件都呈现为“???”,然后输入“cd ???”它不知道使用哪个(或者更糟糕的是会选择任意一个)。
您不输入???,您输入的是真实姓名,它只是显示为???。把它想象成一个密码输入框。输入的内容显示为***,但提交的是原文。
这确实适用于直接在命令提示符下运行的命令。但是,在运行 .cmd 批处理文件时,我仍然需要将 chcp 65001 放在批处理文件的顶部。
在你的情况下,这是一个字体问题......内容在那里,只是没有合适的字体来显示它。但是OP不同。
P
Peter Mortensen

在 Windows 10 x64 机器上,我通过以下方式使命令提示符显示非英文字符:

打开提升的命令提示符(以管理员身份运行 CMD.EXE)。通过以下方式在您的注册表中查询可用的 TrueType 字体到控制台:

    REG query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont"

您将看到如下输出:

    0    REG_SZ    Lucida Console
    00    REG_SZ    Consolas
    936    REG_SZ    *新宋体
    932    REG_SZ    *MS ゴシック

现在我们需要添加一个支持您需要的字符的 TrueType 字体,例如 Courier New。我们通过向字符串名称添加零来做到这一点,因此在这种情况下,下一个将是“000”:

    REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont" /v 000 /t REG_SZ /d "Courier New"

现在我们实现 UTF-8 支持:

    REG ADD HKCU\Console /v CodePage /t REG_DWORD /d 65001 /f

将默认字体设置为“Courier New”:

    REG ADD HKCU\Console /v FaceName /t REG_SZ /d "Courier New" /f

将字体大小设置为 20:

    REG ADD HKCU\Console /v FontSize /t REG_DWORD /d 20 /f

如果您愿意,可以启用快速编辑:

    REG ADD HKCU\Console /v QuickEdit /t REG_DWORD /d 1 /f

一般来说,使用代码页 65001 只能在 Windows 10 中使用 Creators 更新而没有错误。在 Windows 7 中,它将同时存在输出和输入错误。在 Windows 8 和更早版本的 Windows 10 中,它只有输入错误,将输入限制为 7 位 ASCII。
我试过用这个方法,现在字体超级小,看起来是永久的。
P
Peter Mortensen

一个非常简单的选择是安装 Windows bash shell,例如 MinGW 并使用它:

https://i.stack.imgur.com/o6phE.png

有一点学习曲线,因为您需要使用 Unix 命令行功能,但您会喜欢它的强大功能,并且可以将控制台字符集设置为 UTF-8。

https://i.stack.imgur.com/G51mw.png

当然,您还可以获得所有常见的 *nix 好东西,例如 grep、find、less 等。


在这种(旧)情况下,问题出在脚本而不是控制台上。使用 bash 脚本会解决这个问题吗?
是的,确实它们可以将木 bash 脚本标记为 UTF-8,并且比 Windows 批处理文件具有更大的功能 - 我知道这是一个旧案例,但认为该选项值得标记以供将来参考,因为 MS 似乎没有在 Unicode 方面变得更好。
grepfindless
输出 UTF-8 编码的字符很好。但是输入仍然由系统代码页编码。
只是补充一点,如果您使用 Git,Windows 用户可能已经有一个 bash shell:只需打开一个 Git > Git Bash 窗口。
z
zvi

我发现这种方法在新版本的 Windows 10 中很有用:

打开此功能:“Beta:使用 Unicode UTF-8 获得全球语言支持”

控制面板->区域设置->管理选项卡->更改系统区域设置...

https://i.stack.imgur.com/6D4ut.png


如何通过使用 powershell 或 cmd 来实现这一点?
我正在尝试在控制台中显示中文字符,但在 Windows 10 64 位(安装在土耳其语,后来改为英语)上不起作用。接下来,我将尝试安装中文,看看它是否有效。
请注意这一点,它破坏了一些在服务器 2019 中运行良好的旧程序和糟糕程序的功能。
V
VonC

从 2019 年 6 月开始,使用 Windows 10,您无需更改代码页。

请参阅“Introducing Windows Terminal”(来自 Kayla Cinnamon)和 Microsoft/Terminal
通过使用 Consolas 字体,将提供 部分 Unicode 支持。

Microsoft/Terminal issue 387 中所述:

目前 Unicode 中有 87,887 个表意文字。你也需要它们吗?我们需要一个边界,超出该边界的字符应该由字体回退/字体链接/其他处理。 Consolas 应涵盖的内容:现代 OSS 程序在 CLI 中用作符号的字符。这些角色应遵循 Consolas 的设计和指标,并与现有的 Consolas 角色正确对齐。 Consolas 不应涵盖的内容:拉丁文、希腊文和西里尔文以外的字符和标点符号,尤其是需要复杂造型的字符(如阿拉伯语)。这些字符应使用字体回退处理。


C
Community

由于我还没有看到 Python 2.7 的任何完整答案,我将概述两个重要步骤和一个非常有用的可选步骤。

您需要支持 Unicode 的字体。 Windows 附带 Lucida Console,可以通过右键单击命令提示符的标题栏并单击 Defaults 选项来选择它。这也可以访问颜色。请注意,您还可以通过选择“属性”来更改以某些方式(例如,在此处打开、Visual Studio)调用的命令窗口的设置。您需要将代码页设置为 cp65001,这似乎是 Microsoft 为命令提示符提供 UTF-7 和 UTF-8 支持的尝试。通过在命令提示符下运行 chcp 65001 来执行此操作。一旦设置,它就会保持这种状态,直到窗口关闭。每次启动 cmd.exe 时都需要重新执行此操作。

如需更持久的解决方案,请参阅超级用户的this answer。简而言之,使用 regedit 在 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor 创建一个 REG_SZ(字符串)条目并将其命名为 AutoRun。将其值更改为 chcp 65001。如果您不想看到命令的输出消息,请改用 @chcp 65001>nul

一些程序在与这种编码交互时遇到了麻烦,MinGW 是一个值得注意的程序,它在编译时会出现无意义的错误消息。尽管如此,这非常有效,并且不会导致大多数程序出现错误。


c
code4j

这个问题很烦人。我的文件名和文件内容中通常有中文字符。请注意,我使用的是 Windows 10,这是我的解决方案:

如果您在 Windows 10 上安装了 Ubuntu bash,则显示 文件名,例如 dirls

设置区域以支持非 utf 8 字符。之后,控制台的字体将更改为该语言环境的字体,并且还更改了控制台的编码。

完成前面的步骤后,为了使用命令行工具显示 UTF-8 文件的文件内容

通过 chcp 65001 将页面更改为 utf-8 更改为支持 utf-8 的字体,例如 Lucida Console 使用 type 命令查看文件内容,或者如果您在 Windows 10 上安装了 Ubuntu bash 请注意,在设置控制台编码为utf-8,使用中文输入法无法在cmd中输入汉字。

最懒惰的解决方案:只需使用控制台模拟器,例如 http://cmder.net/


这不适合我。 point 命令输出的汉字仍然是乱码。
@SiqingYu 我放弃了疯狂的设置。只需使用 blog.miniasp.com/post/2015/09/27/Useful-tool-Cmder.aspx
我之前用过 Cmder,但是它不能替代 Visual Studio 使用的开发者控制台。
@SiqingYu 你的意思是c#交互式powershell吗?
不是交互式电源外壳,而是 Visual C++ 也使用的开发人员控制台。它是 Win32 控制台应用程序项目中的默认调试控制台。
P
Peter Mortensen

对于类似的问题,(我的问题是在命令提示符下显示来自 MySQL 的 UTF-8 字符),

我是这样解决的:

我将命令提示符的字体更改为 Lucida Console。 (此步骤必须与您的情况无关。它仅与您在屏幕上看到的内容有关,与真正的角色无关)。我将代码页更改为 Windows-1253。您可以通过“chcp 1253”在命令提示符下执行此操作。它适用于我想查看 UTF-8 的情况。


Windws-1253 不是 Unicode 代码页。这是一个标准的 256 个字符的代码页。显然您只使用了可以在该代码页中显示的字符,但它不是通用的。
S
S. Hristov

如果您的计算机在 DOS 窗口中键入时显示路径/文件名正确,则可以快速决定 .bat 文件:

复制 con temp.txt [按 Enter] 键入路径/文件名 [按 Enter] 按 Ctrl-Z [按 Enter]

这样您就可以创建一个 .txt 文件 - temp.txt。在记事本中打开它,复制文本(不要担心它看起来不可读)并将其粘贴到您的 .bat 文件中。在 DOS 窗口中执行以这种方式创建的 .bat 对我有用(西里尔文,保加利亚文)。


R
Robert Boehne

我在这里看到了几个答案,但它们似乎没有解决这个问题 - 用户希望从命令行获取 Unicode 输入。

Windows 使用 UTF-16 对两个字节字符串进行编码,因此您需要从程序中的操作系统获取这些字符串。有两种方法可以做到这一点 -

1) 微软有一个扩展允许 main 采用宽字符数组: int wmain(int argc, wchar_t *argv[]); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx

2)调用windows api获取命令行的unicode版本 wchar_t win_argv = (wchar_t)CommandLineToArgvW(GetCommandLineW(), &nargs); https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw

阅读此内容:http://utf8everywhere.org 了解详细信息,尤其是在您支持其他操作系统的情况下。


啊,不,我很抱歉,但你错过了这个问题。这是在我编写将接收 unicode 字符的程序时使用的。我的问题是关于将 unicode 字符发送到另一个程序(希望它支持接收它们,但除了反汇编之外我真的没有办法知道)。
P
Peter Mortensen

更清洁的做法:只需安装可用的免费 Microsoft 日语语言包。 (其他东方语言包也可以,但我测试过日语包。)

这为您提供了具有更大字形集的字体,使它们成为默认行为,更改各种 Windows 工具,如 cmd、写字板等。


P
Peter Mortensen

将代码页更改为 1252 对我有用。对我来说,问题是符号 double doller § 正在 Windows Server 2008 上由 DOS 转换为另一个符号。

我在 BCP 声明中使用了 CHCP 1252 和前面的上限 ^§。


谢谢它的作品!我不知道为什么人们投了反对票,这对某些人来说是一个有效的替代方案。这个代码页 1252 确实也解决了 Windows Server 2012 上的问题,其中与 CP 65001 相同的代码对我不起作用。我想这取决于编辑批处理脚本的代码页或操作系统默认值。在这种情况下,它是在具有 en-US 基本操作系统的德国 MUI 机器上使用记事本创建的。
P
Peter Mortensen

我通过在批处理文件中通过它们的短(8 点 3)名称引用它们来解决删除 Unicode 命名文件的类似问题。

可以通过执行 dir /x 查看短名称。显然,这只适用于已知的 Unicode 文件名。


新磁盘有 8.3 name generation disabled by default,这不起作用
a
afkjm

请注意那些使用 WSL 且不想要来自 Cygwin 或 Git 的额外包的用户,wsltty 可用,它仅提供支持 UTF-8 的终端