首页 > 解决方案 > 如何在 TCL 中从 Windows exec 输出转换字符编码

问题描述

我只是对这个生气。我已经阅读了所有内容:没有运气的答案、wiki 和手册页。

我需要在保留完整字符本地化的 TCL 脚本中转换从 Windows 命令返回的输出,我的意思是“exec”命令的输出。

所以,让我们说:

catch { exec cmd.exe /C dir } _output

puts $_output

这将打印任何未正确显示的本地化字符。

有什么建议可以解决这个问题吗?

谢谢你的时间。

标签: windowstcl

解决方案


如果默认情况下编码不正确 - 它与 的结果不同encoding system,后者也是文件名和其他输入操作系统的其他字符串的编码 - 那么你不能使用exec. 但一切都没有丢失。而不是exec,使用这个:

# Open as a binary pipeline
set f [open |[list cmd.exe /C dir] "rb"]
set data [read $f]
close $f

现在你有了命令中的文字字节,不管它们是什么,并且可以encoding convertfrom用来处理混乱,可能在 and 的帮助下regexpstring range根据需要对字符串进行切片和切块。毕竟,Tcl 中的二进制数据只是另一种字符串。


如果您只是使用它来列出文件名,请改用内置glob命令。它速度更快,并且避免了所有这些问题,除非在最奇怪的情况下(例如使用错误的文件系统级元数据的奇怪外部设备)。


推荐阅读