我已经尝试了文件复制命令,但它说复制错误
“/tmp/file7k5kqg”到“/path/to/dir/mémo.txt”:没有这样的文件或
目录
我对您的问题的解读是,出于某种原因,您的 Tcl 设置为 iso8859-1 ([encoding system]),而执行环境 (shell) 设置为 utf-8。这解释了为什么 Donal 的建议对您有用:
encoding system iso8859-1
file copy $tmp_filename [encoding convertto utf-8 $dest_path]
这将安全地将utf-8 编码的字节数组传递给任何系统调用:é 或\xc3\xa9 或\u00e9。观看:
% binary encode hex [encoding convertto utf-8 é]
c3a9
% encoding system iso8859-1; exec xxd << [encoding convertto utf-8 é]
00000000: c3a9 ..
这相当于[encoding system] 也被设置为utf-8(正如在utf-8 环境中所预期的那样):
% encoding system
utf-8
% exec xxd << é
00000000: c3a9 ..
您正在经历的(没有任何干预)似乎是在从 Tcl 退出时将 Tcl 内部编码重新编码为 iso8859-1(因为 [encoding system],正如 Donal 所描述的那样),以及后续 -将此iso8859-1 值重新编码(和错误)到utf-8 环境中。
注意区别(\xe9 与 \xc3\xa9):
% encoding system iso8859-1
% encoding system
iso8859-1
% exec xxd << é
00000000: e9
问题似乎是 \xe9 将在您的其他 utf-8 环境中解释,例如:
$ 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
您的选择:
(1) 首先,您需要找出 Tcl 选择iso8859-1 的原因。您是如何获得安装的?自编?详情(版本)是什么?
(2) 您可以按照 Donal 的建议进行操作,或者明确设置 encoding system utf-8。
encoding system utf-8
file copy $tmp_filename $dest_path