Tcl文件存在对于带有中文字符的文件名失败
运行检查文件存在性的tcl脚本时,tcl内置命令(Tcl文件存在对于带有中文字符的文件名失败,tcl,Tcl,运行检查文件存在性的tcl脚本时,tcl内置命令(file exists)失败,因为文件路径和文件名(文档名称)包含中文字符。我知道Tcl解释器支持Unicode字符。我尝试了命令encoding convertfrom和encoding convertto,但没有解决问题 另外,当我在Tcl中将汉字指定给字符串时,比如 set a "文档名称" puts $a 控制台会打印一些奇怪的值,但不会打印带有汉字的字符串。我尝试使用上述相同的编码命令将字符串a转换为utf-8,但没有成功。在这两种情
file exists
)失败,因为文件路径和文件名(文档名称代码>)包含中文字符。我知道Tcl解释器支持Unicode字符。我尝试了命令encoding convertfrom
和encoding convertto
,但没有解决问题
另外,当我在Tcl中将汉字指定给字符串时,比如
set a "文档名称"
puts $a
控制台会打印一些奇怪的值,但不会打印带有汉字的字符串。我尝试使用上述相同的编码命令将字符串a转换为utf-8,但没有成功。在这两种情况下,我都不确定我会错在哪里。甚至我也试着将字符打印到一个文件中,这也显示了一些奇怪的字符。请帮我解决这个问题
使用脚本:
set flist [glob *]
foreach f $flist {
if { [file exists $f] } {
puts "$f: OK"
} else {
puts "$f: NG"
}
}
set a "文档名称"
set f $a
if { [file exists $f] } {
puts "$f: OK"
} else {
puts "$f: NG"
}
只要运行tclsh.exe script.tcl
,最后一条if语句就会失败。
使用系统编码读入脚本,并输入汉字
未正确转换。第一个循环使用glob
语句工作
使用tclsh.exe-encoding utf-8 script.tcl
,最后的if语句就可以工作了
本质上,教训是不要在脚本中嵌入utf-8字符。
相反,从文件中读取数据(使用fconfigure$fh encoding utf-8
),
或者从另一个来源,然后使用数据
cmd.exe windows控制台不支持备用字符集,因此无法
用于调试。这根本行不通。而是编写调试代码
输出到文件并使用记事本查看文件。使用脚本:
set flist [glob *]
foreach f $flist {
if { [file exists $f] } {
puts "$f: OK"
} else {
puts "$f: NG"
}
}
set a "文档名称"
set f $a
if { [file exists $f] } {
puts "$f: OK"
} else {
puts "$f: NG"
}
只要运行tclsh.exe script.tcl
,最后一条if语句就会失败。
使用系统编码读入脚本,并输入汉字
未正确转换。第一个循环使用glob
语句工作
使用tclsh.exe-encoding utf-8 script.tcl
,最后的if语句就可以工作了
本质上,教训是不要在脚本中嵌入utf-8字符。
相反,从文件中读取数据(使用fconfigure$fh encoding utf-8
),
或者从另一个来源,然后使用数据
cmd.exe windows控制台不支持备用字符集,因此无法
用于调试。这根本行不通。而是编写调试代码
输出到文件并使用记事本查看该文件。编码系统为您返回了什么?运行代码时,您看到的“奇怪字符”是什么?你在哪个平台上运行?我怀疑系统编码(实际上是系统调用中用于通信字符串的编码,以及所有通道的默认编码)与你的操作系统不匹配;有一件事会产生你所描述的所有奇怪的效果。上面的命令返回字符“-”和编码系统是cp1252。我在windows 10上运行它。如果是编码系统的问题,我应该为汉字使用哪种编码系统?utf-8或其他?如果我想读日文字符,我应该再次更改编码吗?嗯,里面根本没有汉字。这就是问题所在。(如果您在非Windows上,最有可能的修复方法是编码系统utf-8
。在Windows上…不知道!)编码系统为您返回了什么?运行代码时,您看到的“奇怪字符”是什么?你在哪个平台上运行?我怀疑系统编码(实际上是系统调用中用于通信字符串的编码,以及所有通道的默认编码)与你的操作系统不匹配;有一件事会产生你所描述的所有奇怪的效果。上面的命令返回字符“-”和编码系统是cp1252。我在windows 10上运行它。如果是编码系统的问题,我应该为汉字使用哪种编码系统?utf-8或其他?如果我想读日文字符,我应该再次更改编码吗?嗯,里面根本没有汉字。这就是问题所在。(如果您在非Windows上,最可能的修复方法是编码系统utf-8
。在Windows上…不知道!)IIRC,Tcl对Windows控制台的访问是通过使用宽字符的调用进行的。IIRC,Tcl对Windows控制台的访问是通过使用宽字符的调用进行的。