如何在TCL中检测字符串中的“ÿ”?

时间:2013-03-18 15:37:44

标签: string parsing unicode tcl

我正在查询旧的Tektronix 11801B采样示波器。当我查询任何内容时,它总是返回我的结果,然后在一个设备上返回无限字符串“ÿ”或在另一个设备上显示“ÿ..”(两个模型相同)。所以,我决定在查询时点击“ÿ”之前阅读所有内容。

我尝试了两种方法:

# Issue command
puts ${ChannelId} ${Command}

# Set loop variables
set Result [list]
set Byte [read ${ChannelId} 1]
set BadByte ÿ

# Loop until BadByte is found
while {![string equal -nocase ${Byte} ${BadByte}]} {

    # Append good bytes to a list
    lappend Result ${Byte}

    # Read next byte
    set Byte ::visa::read ${ChannelId} 1]
}

# Join and return result list
return [join ${Result}]

# Set loop variable
set Result [list]

# Read channel 1 byte at a time until ÿ is found
while {![string equal -nocase [set Character [read ${ChannelId} 1]] "ÿ"]} {

    # Append non ÿ characters to a list
    lappend Result ${Character}
}

# Join the result and return it
return [join ${Result}]

在这两种情况下,我的循环总是返回true并变为无限。但是,如果我逐行运行命令,希望一切正常。

1 个答案:

答案 0 :(得分:2)

我认为问题在于如何来源文件。默认情况下,它使用encoding system,如果您将文件另存为UTF-8,则会出现问题。你可以看到Tcl如何看到ÿ char;您可以尝试以下脚本:

binary scan ÿ c* bytes
puts $bytes

如果输出不是-1,那确实是这种情况。

避免这种情况的最佳方法是使用\xff代替(编码ASCII范围之外的每个字符)。这是我不仅推荐用于Tcl,还推荐用于Java,C#等许多其他语言的东西。

所以你有以下选择:

  • 使用\xff代替ÿ
  • 使用系统编码保存文件(使用正确的编码打开Tcl中的两个文件,并且可以执行此操作)
  • 使用正确的编码来源文件。如果使用tclsh调用,请使用tclsh -encoding utf-8 yourfile.tcl。如果您使用source命令,则使用source -encoding utf-8 yourfile.tcl

如果所有这些都不起作用,您可以尝试在输入binary scan上执行ÿ,看看它是什么样的。