对于包含非 ASCII 符号的文件,Sysinternals 句柄实用程序用 打印文件名?
。以下位置也报告了类似的问题:
再现场景
- 在 Adobe Acrobat Reader 中打开一个文件
C:\test\fileфайлファイル文件.pdf
即可锁定它。 - 执行以下命令将
cmd.exe
导致打印的文件名为C:\test\file??????????.pdf
:
C:\> handle64 -nobanner C:\test\fileфайлファイル文件.pdf
Acrobat.exe pid: 10616 type: File 440: C:\test\file??????????.pdf
- 如果我使用命令将输出重定向到文件,也会发生同样的情况
handle64 -nobanner C:\test\fileфайлファイル文件.pdf > 1.txt
。文件内容将与控制台中的内容相同。在十六进制编辑器中打开文件会显示?
符号实际上是带有代码的问号x3F
。因此,我认为这不是我机器上的编码问题。
问题
如何修复或解决这个问题?
目前最好的解决方法。
二进制补丁来自@NewcomerAl 的回答修复了这个问题。修补后的二进制文件可以从具有 Unicode 支持的 Sysinternals 控制台实用程序GitHub 存储库。
答案1
可以通过应用以下二进制补丁来解决此问题HANDLE64.EXE V5.0_setmode(_fileno(stdout), _O_U8TEXT)
在函数开头注入main
。此函数使 Handle 工具以支持非 ASCII 符号的 UTF8 格式打印其输出。
修补
# Description
# injects `_setmode(_fileno(stdout), _O_U8TEXT)` at the beginning of the `main` function. Only works for "HANDLE64.EXE v5.0"
handle64.exe
00008510: 48 E9
00008511: 33 FF
00008512: C4 DF
00008513: 48 02
00008514: 89 00
00036514: 00 50
00036515: 00 51
00036516: 00 52
00036517: 00 41
00036518: 00 50
00036519: 00 41
0003651A: 00 51
0003651B: 00 48
0003651C: 00 83
0003651D: 00 EC
0003651E: 00 30
0003651F: 00 BA
00036522: 00 04
00036524: 00 B9
00036525: 00 01
00036529: 00 E8
0003652A: 00 7A
0003652B: 00 FD
0003652C: 00 FD
0003652D: 00 FF
0003652E: 00 48
0003652F: 00 83
00036530: 00 C4
00036531: 00 30
00036532: 00 41
00036533: 00 59
00036534: 00 41
00036535: 00 58
00036536: 00 5A
00036537: 00 59
00036538: 00 58
00036539: 00 48
0003653A: 00 33
0003653B: 00 C4
0003653C: 00 48
0003653D: 00 89
0003653E: 00 84
0003653F: 00 24
00036540: 00 50
00036541: 00 01
00036544: 00 E9
00036545: 00 D2
00036546: 00 1F
00036547: 00 FD
00036548: 00 FF
如何申请
- 将上述补丁保存到文件中
patch.txt
并将其放在可执行文件旁边handle64.exe
。 - 从此处下载 powershell 脚本@DitherSky 的回答并将脚本放在
handle64.exe
可执行文件旁边。 - 使用以下命令创建一个批处理脚本文件
runme.cmd
并将其放在可执行文件旁边handle64.exe
:
@cd /d "%~dp0"
@powershell -executionpolicy bypass -File fc2bin.ps1 -Apply patch.txt
@pause
- 运行批处理脚本
runme.cmd
以将修复程序应用到handle64.exe
可执行文件。