Tcl文件存在对于带有中文字符的文件名失败

Tcl文件存在对于带有中文字符的文件名失败,tcl,Tcl,运行检查文件存在性的tcl脚本时,tcl内置命令(file exists)失败,因为文件路径和文件名(文档名称)包含中文字符。我知道Tcl解释器支持Unicode字符。我尝试了命令encoding convertfrom和encoding convertto,但没有解决问题 另外,当我在Tcl中将汉字指定给字符串时,比如 set a "文档名称" puts $a 控制台会打印一些奇怪的值,但不会打印带有汉字的字符串。我尝试使用上述相同的编码命令将字符串a转换为utf-8,但没有成功。在这两种情

运行检查文件存在性的tcl脚本时,tcl内置命令(
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控制台的访问是通过使用宽字符的调用进行的。