7

文字列内のすべての文字の ASCII 文字を取得する必要があります。実際には、(小さな)ファイル内のすべての文字。次の最初の 3 行は、すべてのファイルの内容を文字列に正常にプルします (このレシピに従って):

set fp [open "store_order_create_ddl.sql" r]
set data [read $fp]
close $fp

文字の ASCII コードを正しく認識していると思います ( http://wiki.tcl.tk/1497を参照)。ただし、文字列内のすべての文字をループする方法を理解するのに問題があります。

まず第一に、以下は Tcl を使用して文字列内の文字をループする特に慣用的な方法ではないと思います。2 つ目は、さらに重要なことですが、すべての文字の間に余分な要素が挿入され、正しく動作しません。

以下は、上記で設定した「データ」変数の内容に基づいて動作するように記述したコードと、それに続くサンプル出力です。

コード:

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

2 に答える 2

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) がある理由はありますか?

于 2009-11-04T18:31:20.197 に答える
0

何か他のものを探しているときに、この古い質問に出くわしました..この質問への回答を探している可能性のある他の人の利益のために回答します..

まず、文字エンコーディングとは何かを理解します。この例のソース データは ASCII 文字エンコーディングではないため、ASCII 文字コード (コード 0 ~ 127) には実際には意味がありません。この例を除いて、エンコーディングは UTF-16 のように見えますが、これには ASCII コードがサブセットとして含まれています。 . おそらく必要なのは、0 から 255 までの「文字」コードの全範囲ですが、システムやデータのソースなどによっては、コード 128 から 255 が ANSI、ISO、またはその他の奇妙なコード ページである可能性があります。あなたがしたいことは、Windows 1252 標準エンコーディング (エンコーディング " cp1252")、または "encoding" コマンドを使用した UTF-8 (エンコーディング "utf-8"):

set data [encoding convertto utf-8 $data] ;# UTF-8の場合

set data [encoding convertto iso8859-1 $data] ;# ISO 8859-1 の場合

等々。ファイルからデータを読み取る場合は、データを読み取る前に (fconfigure を介して) ファイル エンコーディングを設定して、ファイル データを正しく読み取っていることを確認することもできます。文字セットのエンコード処理の詳細については、「encoding」(および「fconfigure」) のマニュアル ページを参照してください。

データのエンコーディングを制御したら、サンプル コードの残りの部分は期待どおりに動作するはずです。

于 2015-04-15T19:20:00.017 に答える