代码之家  ›  专栏  ›  技术社区  ›  Dexygen

用于获取字符串中每个字符的ASCII代码的Tcl

  •  7
  • Dexygen  · 技术社区  · 15 年前

    我需要得到字符串中每个字符的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)
    
    2 回复  |  直到 9 年前
        1
  •  11
  •   RHSeeger    15 年前

    以下代码应该有效:

    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)?

        2
  •  0
  •   C. M.    9 年前

    在寻找其他东西的时候遇到了这个老问题。回答这个问题的目的是为了让任何其他人都能找到答案。

    首先,了解什么是字符编码。本例中的源数据不是ASCII字符编码,因此ASCII字符代码(代码0-127)实际上没有意义——除了本例中,编码似乎是UTF-16,其中包括作为子集的ASCII代码。您可能需要的是从0到255的全系列“字符”代码,但根据您的系统、数据源等,代码128-255可能是ANSI、ISO或其他一些奇怪的代码页。您要做的是将数据转换为您知道如何处理的格式,例如非常常见的ISO 8859-1代码(编码“ISO8859-1”),它与Windows 1252标准编码(编码“CP1252”)或带“编码”命令的UTF-8(编码“UTF-8”)非常相似:

    设置数据[编码转换为UTF-8$data];用于UTF-8

    设置数据[编码转换为ISO8859-1$data];用于ISO 8859-1

    等等。如果您正在从文件读取数据,您可能还需要在读取数据之前设置文件编码(通过fconfigure),以确保正确读取文件数据。有关处理字符集编码的更多详细信息,请查看“编码”(和“fconfigure”)的手册页。

    一旦控制了数据的编码,其余的示例代码就应该如预期的那样工作。