【发布时间】:2010-12-13 03:19:21
【问题描述】:
我需要获取字符串中每个字符的 ASCII 字符。实际上它是一个(小)文件中的每个字符。以下前 3 行成功地将文件的所有内容拉入一个字符串(每个 this recipe):
set fp [open "store_order_create_ddl.sql" r]
set data [read $fp]
close $fp
我相信我可以正确识别字符的 ASCII 码(请参阅 http://wiki.tcl.tk/1497)。但是,我在弄清楚如何遍历字符串中的每个字符时遇到了问题。
首先,我不认为以下是使用 Tcl 在字符串中循环字符的一种特别惯用的方法。其次,更重要的是,它的行为不正确,在每个字符之间插入了一个额外的元素。
下面是我编写的代码,用于处理上面设置的“数据”变量的内容,然后是一些示例输出。
代码:
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)"
}
输出:
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 little-endian,而不是ASCII。
-
Arthur,我很欣赏你的评论,但我很想知道,如何你能从输出中看出(它是 UTF-16 little-endian)吗?
-
UTF-16 使用两字节单元对字符进行编码。对于前 65536 个 Unicode 字符(所谓的平面 0),它使用其中一个单元,对于所有其余的,它使用两个(即 4 个字节,但区分为两个 代理字符 编码每个在两个字节上)。 ASCII 字符构成前 128 个 Unicode 字符,因此它们使用两个字节进行编码,最高有效位始终为 0,最低有效位等于字符的 ASCII 码。在这里,您会看到每个 ASCII 代码后跟一个空字节,因此您首先拥有最小顺序字节,即 UTF-16LE。
-
感谢 Arthur,这比我在此期间查阅的 Wikipedia 文章更清楚!
-
亚瑟,请考虑将其写成答案而不是评论,我肯定会赞成并可能接受它;这样您就可以为您的意见赢得一些声誉。
标签: string list ascii tcl utf-16