windows - 如何在 TCL 中从 Windows exec 输出转换字符编码
问题描述
我只是对这个生气。我已经阅读了所有内容:没有运气的答案、wiki 和手册页。
我需要在保留完整字符本地化的 TCL 脚本中转换从 Windows 命令返回的输出,我的意思是“exec”命令的输出。
所以,让我们说:
catch { exec cmd.exe /C dir } _output
puts $_output
这将打印任何未正确显示的本地化字符。
有什么建议可以解决这个问题吗?
谢谢你的时间。
解决方案
如果默认情况下编码不正确 - 它与 的结果不同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 的帮助下regexp
,string range
根据需要对字符串进行切片和切块。毕竟,Tcl 中的二进制数据只是另一种字符串。
如果您只是使用它来列出文件名,请改用内置glob
命令。它速度更快,并且避免了所有这些问题,除非在最奇怪的情况下(例如使用错误的文件系统级元数据的奇怪外部设备)。
推荐阅读
- node.js - Firebase 函数:无法读取未定义的属性“post_id”
- c# - 使用 BrokeredMessage 从 Azure 服务总线队列 (v1) 反序列化强类型对象
- javascript - 通过javascript在div中添加元素的问题
- visual-studio-code - 禁用 VSCode 自动更新但允许其他用户设置
- javascript - 如何在我的支付网关结帐过程中结帐时分配商店的订单价值(金额)?
- c# - 自定义编辑器模板未呈现/触发
- c++ - 多核虚假共享
- javascript - 在javascript中显示日期和时间的代码每天下午5点迭代到第二天
- spring - 消费者线程错误,SimpleMessageListenerContainer 上的线程中止
- java - Spring JPA Crud 存储库保存不返回 UUID 字段