首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于获取字符串中每个字符的ASCII代码的Tcl

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

Stack Overflow用户
提问于 2009-11-05 02:15:50
回答 2查看 22.1K关注 0票数 7

我需要获取字符串中每个字符的ASCII字符。实际上,它是一个(小)文件中的每个字符。以下前3行成功地将一个文件的所有内容拉入一个字符串(每个this recipe):

代码语言:javascript
复制
set fp [open "store_order_create_ddl.sql" r]
set data [read $fp]
close $fp

我相信我正确地识别了字符的ASCII码(参见http://wiki.tcl.tk/1497)。然而,我在弄清楚如何遍历字符串中的每个字符时遇到了一个问题。

首先,我不认为下面是使用Tcl循环字符串中字符的一种特别惯用的方法。其次,也是更重要的是,它的行为不正确,在每个字符之间插入一个额外的元素。

下面是我为处理上面设置的"data“变量的内容而编写的代码,后面是一些示例输出。

代码:

代码语言:javascript
复制
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)"
}

输出:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-05 02:31:20

下面的代码应该可以工作:

代码语言:javascript
复制
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),这是不是有什么原因?

票数 11
EN

Stack Overflow用户

发布于 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")的手册页。

一旦控制了数据的编码,示例代码的其余部分就应该可以正常工作了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1675677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档