我需要为字符串中的每个字符获取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在字符串中循环字符的特殊惯用方法。其次,更重要的是,它表现不正确,在每个角色之间插入一个额外的元素。
下面是我编写的代码,用于处理上面“数据”变量集的内容,然后是一些示例输出。
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)"
}
输出:
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)
答案 0 :(得分:11)
以下代码应该有效:
set data {CREATE TABLE}
foreach char [split $data ""] {
lappend output [scan $char %c]
}
set output ;# 67 82 69 65 84 69 32 84 65 66 76 69
就输出中的额外字符而言,问题似乎来自文件中的输入数据。是否有某些原因在文件中的每个字符之间都会出现空字符(\ 0)?
答案 1 :(得分:0)
在寻找其他东西的同时遇到了这个老问题。为了其他任何可能正在寻找这个问题答案的人的利益而回答这个问题..
首先,了解字符编码是什么。示例中的源数据不是ASCII字符编码,因此ASCII字符代码(代码0-127)实际上没有任何意义 - 除了在此示例中,编码似乎是UTF-16,其中包括ASCII代码作为子集。你可能想要的是全方位的#34;字符&#34;代码从0到255,但根据您的系统,数据来源等,代码128-255可能是ANSI,ISO或其他一些奇怪的代码页。你想要做的是将数据转换为你知道如何处理的格式,例如非常常见的ISO 8859-1代码(编码&#34; iso8859-1&#34;),这与Windows 1252非常相似使用&#34;编码&#34;标准编码(编码&#34; cp1252&#34;)或UTF-8(编码&#34; utf-8&#34;)命令:
设置数据[编码转换为utf-8 $数据];#对于UTF-8
设置数据[编码转换为iso8859-1 $ data];#对于ISO 8859-1
等等。如果您正在从文件中读取数据,则可能还需要在读取数据之前设置文件编码(通过fconfigure),以确保正确读取文件数据。查找&#34;编码&#34;的手册页(以及&#34; fconfigure&#34;)有关处理字符集编码的更多详细信息。
一旦您对数据的编码进行了控制,示例代码的其余部分应该按预期工作。