我需要获取字符串中每个字符的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循环字符串中字符的一种特别惯用的方法。其次,也是更重要的是,它的行为不正确,在每个字符之间插入一个额外的元素。
下面是我为处理上面设置的"data“变量的内容而编写的代码,后面是一些示例输出。
代码:
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)发布于 2009-11-05 02:31:20
下面的代码应该可以工作:
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),这是不是有什么原因?
发布于 2015-04-16 03:20:00
在寻找其他东西的时候遇到了这个老问题..为了其他可能正在寻找这个问题的答案的人的利益,我将回答它。
首先,了解什么是字符编码。示例中的源数据不是ASCII字符编码,因此ASCII字符代码(代码0-127)实际上没有意义--除了在本例中,编码似乎是UTF-16,它将ASCII代码作为一个子集。您可能需要的是从0到255的所有“字符”代码,但根据您的系统、数据来源等,代码128-255可能是ANSI、ISO或其他一些奇怪的代码页。您要做的是将数据转换为您知道如何处理的格式,例如非常常见的ISO8859-1代码(编码为"iso8859-1"),它非常类似于Windows1252标准编码(编码为"cp1252"),或使用“编码”命令的UTF-8 (编码为"utf-8"):
为utf-8设置数据编码转换为UTF-8 $data ;#
将数据编码转换设置为ISO 8859-1的$data ;#
诸若此类。如果您正在从文件中读取数据,则可能需要在读取数据之前设置文件编码(通过fconfigure),以确保正确读取文件数据。有关处理字符集编码的更多详细信息,请查看“编码”(和"fconfigure")的手册页。
一旦控制了数据的编码,示例代码的其余部分就应该可以正常工作了。
https://stackoverflow.com/questions/1675677
复制相似问题