我需要获取字符串中每个字符的ASCII字符。其实它在(小)文件中的每个字符。下面的前3行成功地拉了文件的所有内容到(每this recipe)的字符串:Tcl获取字符串中每个字符的ASCII码
set fp [open "store_order_create_ddl.sql" r]
set data [read $fp]
close $fp
我相信我正确辨别的人物(见http://wiki.tcl.tk/1497)的ASCII码。不过,我在解决如何遍历字符串中的每个字符时遇到了问题。
首先,我不认为以下是使用Tcl在字符串中循环字符的一种特别惯用的方式。其次,更重要的是,它的行为不正确,在每个字符之间插入一个额外的元素。
下面是我写的代码,用于处理上面设置的“数据”变量的内容,后面跟着一些示例输出。
CODE:
for {set i 0} {$i < [string length $data]} {incr i} {
set char [string index $data $i]
scan $char %c ascii
puts "char: $char (ascii: $ascii)"
}
OUTPUT:
char: C (ascii: 67)
char: (ascii: 0)
char: R (ascii: 82)
char: (ascii: 0)
char: E (ascii: 69)
char: (ascii: 0)
char: A (ascii: 65)
char: (ascii: 0)
char: T (ascii: 84)
char: (ascii: 0)
char: E (ascii: 69)
char: (ascii: 0)
char: (ascii: 32)
char: (ascii: 0)
char: T (ascii: 84)
char: (ascii: 0)
char: A (ascii: 65)
char: (ascii: 0)
char: B (ascii: 66)
char: (ascii: 0)
char: L (ascii: 76)
char: (ascii: 0)
char: E (ascii: 69)
不知道TCL的任何内容,但是我可以从输出中告诉你输入字符串是UTF-16,特别是UTF-16小端,而不是ASCII。 – 2009-11-04 18:27:30
Arthur,我很欣赏这个评论,但是我非常有兴趣知道,*你怎么能从输出中知道(它是UTF-16的小端)? – 2009-11-04 18:35:57
UTF-16使用双字节单位对字符进行编码。对于第一个65536的Unicode字符(所谓的Plane 0),它使用其中一个单位,对于其余所有单位,它使用两个(即4个字节,但分为两个*替代字符*,每个字符编码为两个字节) 。 ASCII字符形成前128个Unicode字符,因此它们使用两个字节进行编码,最重要的字符总是0,最不重要的字符是ASCII码。在这里您会看到每个ASCII代码后跟一个空字节,因此您的第一个最低位字节即UTF-16LE。 – 2009-11-04 19:10:25