如何从 TCL 中的 Windows exec 输出转换字符编码
How to convert character encoding from Windows exec output in TCL
我简直要被这个搞疯了。我已经阅读了所有内容:答案、wiki 和手册页,但运气不佳。
我需要在保留完整字符本地化的 TCL 脚本中转换从 Windows 命令返回的输出,我的意思是 'exec' 命令的输出。
所以,让我们说:
catch { exec cmd.exe /C dir } _output
puts $_output
这将打印任何未正确显示的本地化字符。
有什么解决这个问题的建议吗?
感谢您的宝贵时间。
如果默认编码不正确 — 它与 encoding system
的结果不同,后者也是文件名和输入 OS 的其他杂项字符串的编码— 那么你不能使用 exec
。但一切都没有丢失。而不是 exec
,使用这个:
# Open as a binary pipeline
set f [open |[list cmd.exe /C dir] "rb"]
set data [read $f]
close $f
现在你有了来自命令的文字字节,无论它们是什么, 并且可以使用 encoding convertfrom
来处理混乱,可能需要 [=15] 的帮助=] 和 string range
等等根据需要对该字符串进行切片和切块。毕竟,Tcl 中的二进制数据只是另一种字符串。
如果您只是使用它来列出文件名,请改用内置的 glob
命令。它更快并且避免了所有这些问题,除了最奇怪的情况(例如带有错误文件系统级元数据的奇怪外部设备)。
我简直要被这个搞疯了。我已经阅读了所有内容:答案、wiki 和手册页,但运气不佳。
我需要在保留完整字符本地化的 TCL 脚本中转换从 Windows 命令返回的输出,我的意思是 'exec' 命令的输出。
所以,让我们说:
catch { exec cmd.exe /C dir } _output
puts $_output
这将打印任何未正确显示的本地化字符。
有什么解决这个问题的建议吗?
感谢您的宝贵时间。
如果默认编码不正确 — 它与 encoding system
的结果不同,后者也是文件名和输入 OS 的其他杂项字符串的编码— 那么你不能使用 exec
。但一切都没有丢失。而不是 exec
,使用这个:
# Open as a binary pipeline
set f [open |[list cmd.exe /C dir] "rb"]
set data [read $f]
close $f
现在你有了来自命令的文字字节,无论它们是什么, 并且可以使用 encoding convertfrom
来处理混乱,可能需要 [=15] 的帮助=] 和 string range
等等根据需要对该字符串进行切片和切块。毕竟,Tcl 中的二进制数据只是另一种字符串。
如果您只是使用它来列出文件名,请改用内置的 glob
命令。它更快并且避免了所有这些问题,除了最奇怪的情况(例如带有错误文件系统级元数据的奇怪外部设备)。