File 如何使用TCL'复制名称中带有特殊字符的文件;谁是执行官?

File 如何使用TCL'复制名称中带有特殊字符的文件;谁是执行官?,file,copy,tcl,centos6,aolserver,File,Copy,Tcl,Centos6,Aolserver,我正试图通过exec命令在我们的平台上上传包含特殊字符的文件,但是字符总是被解释的,并且失败了 例如,如果我尝试上载mémo.txt文件,则会出现以下错误: /bin/cp:无法创建常规文件“/path/to/dir/m\351mo.txt”:没有这样的文件或目录 UTF8在系统上配置正确,如果我在shell上运行命令,它可以正常工作 以下是TCL代码: exec/bin/cp$tmp\u文件名$dest\u路径 如何使其工作?问题的核心是使用什么编码与操作系统通信。对于exec和文件名,该编码

我正试图通过
exec
命令在我们的平台上上传包含特殊字符的文件,但是字符总是被解释的,并且失败了

例如,如果我尝试上载mémo.txt文件,则会出现以下错误:

/bin/cp:无法创建常规文件“/path/to/dir/m\351mo.txt”:没有这样的文件或目录

UTF8在系统上配置正确,如果我在shell上运行命令,它可以正常工作

以下是TCL代码:
exec/bin/cp$tmp\u文件名$dest\u路径


如何使其工作?

问题的核心是使用什么编码与操作系统通信。对于
exec
和文件名,该编码是由返回的(Tcl对启动Tcl库时的正确值有很好的猜测,但偶尔会出错)。在我的计算机上,该命令返回
utf-8
,表示(正确!)传递到操作系统(和从操作系统接收到)的字符串是utf-8

您应该能够使用
文件复制
命令,而不是执行
exec/bin/cp
,这在这里会很有帮助,因为这样可以减少麻烦(它可以避免通过一个可能会带来自身问题的外部程序)。我们将假设这样做:

set tmp_filename "foobar.txt";  # <<< fill in the right value, of course
set dest_path "/path/to/dir/mémo.txt"
file copy $tmp_filename $dest_path
在这种情况下,可能需要注意正确转换路径的不同部分:您要对发生的事情负全部责任


如果你在Windows上,请让Tcl来处理细节。Tcl直接使用Wide(Unicode)windowsapi,因此您可以假装这些问题都不存在。(相反,还有其他问题。)

在macOS上,请不要使用编码系统,因为它是正确的。Mac对编码有一种非常固执己见的方法

我已经尝试了文件复制命令,但它显示复制错误 “/tmp/file7k5kqg”to“/path/to/dir/mémo.txt”:没有此类文件或 目录

我对您的问题的理解是,出于某种原因,您的Tcl设置为
iso8859-1
[编码系统]
),而执行环境(shell)设置为
utf-8
)。这就解释了为什么Donal的建议对您有效:

encoding system iso8859-1
file copy $tmp_filename [encoding convertto utf-8 $dest_path]
这将安全地将由tearray编码的
utf-8
传递到任何系统调用:
ee
\xc3\xa9
\u00e9
。观察:

% binary encode hex [encoding convertto utf-8 é] 
c3a9
% encoding system iso8859-1; exec xxd << [encoding convertto utf-8 é] 
00000000: c3a9                                     ..
您正在经历的(没有任何干预)似乎是从Tcl退出时将Tcl内部编码重新编码为
iso8859-1
(因为
[编码系统]
,如Donal所述),并将
iso8859-1
值重新编码到
utf-8
环境中

观察差异(
\xe9
\xc3\xa9
):

但是:

您的选择:

(1) 首先,您需要了解Tcl选择iso8859-1的原因。您是如何获得安装的?自编的?详情(版本)是什么

(2) 您可以按照Donal的建议进行操作,或者明确设置
编码系统utf-8

encoding system utf-8
file copy $tmp_filename $dest_path

非常感谢您的详细回答!
编码系统
命令返回
iso8859-1
。这是否意味着后端操作系统(CentOS 6)配置不正确,或者操作系统(Windows 10)配置不正确?我已经尝试了
文件复制
命令,但它说将“/tmp/file7k5kqg”复制到“/path/to/dir/mémo.txt”时出错:没有这样的文件或目录…命令
文件复制$tmp_文件名[encoding convertto utf-8$dest_path]
确实有效!最后一个代码列表中有一个小的输入错误:
iso98859-1
==>
iso8859-1
最后,我可以通过在文件存储模块中设置
编码系统utf-8
来实现。谢谢您的解释!我可以按照您的建议设置
编码系统utf-8
,使其正常工作。很高兴它有帮助,但请注意,这只是一种解决方法,不是永久性的修复方法。您需要了解为什么Tcl被初始化为
iso8859-1
而不是
utf-8
模式。是的,我将继续调查。我没有安装它,它包含在我们正在使用的这个应用程序中:这是基于,你可能想联系他们。此外,尝试找出在
config.tcl
中是否有一些参数
systemencoding
设置为
iso8859-1
% encoding system
utf-8
% exec xxd << é
00000000: c3a9                                     ..
% encoding system iso8859-1
% encoding system
iso8859-1
%  exec xxd << é
00000000: e9
$ locale
LANG="de_AT.UTF-8"
...
$ echo -ne '\xe9'
?
$ touch `echo -ne 'm\xe9mo.txt'`
touch: m?mo.txt: Illegal byte sequence
$ touch mémo.txt
$ ls mémo.txt 
mémo.txt
$ cp `echo -ne 'm\xe9mo.txt'` b.txt
cp: m?mo.txt: No such file or directory
$ cp `echo -ne 'm\xc3\xa9mo.txt'` b.txt
$ ls b.txt
b.txt
encoding system utf-8
file copy $tmp_filename $dest_path