Ho bisogno di ottenere il carattere ASCII per ogni carattere in una stringa. In realtà ogni suo carattere in un (piccolo) file. Le seguenti prime 3 righe tirare con successo tutti i contenuti di un file in una stringa (per this recipe):Tcl per ottenere il codice ASCII per ogni carattere in una stringa
set fp [open "store_order_create_ddl.sql" r]
set data [read $fp]
close $fp
Credo che sto correttamente discernere il codice ASCII per i caratteri (vedi http://wiki.tcl.tk/1497). Tuttavia ho un problema a capire come eseguire il loop su ogni carattere nella stringa.
Prima di tutto non penso che quanto segue sia un modo particolarmente idiomatico di eseguire il looping dei caratteri in una stringa con Tcl. In secondo luogo, e soprattutto, si comporta in modo errato, inserendo un elemento in più tra ogni personaggio.
Di seguito è riportato il codice che ho scritto per agire sui contenuti della variabile "dati" impostata sopra, seguita da alcuni esempi di output.
CODICE:
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)"
}
USCITA:
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)
Non so nulla di TCL, ma quello che posso dire dall'output è che la stringa di input è in UTF-16, in particolare UTF-16 little-endian, non ASCII. –
Arthur, apprezzo il commento, ma sono molto interessato a sapere, * come * puoi dire che (è il piccolo-endian UTF-16) dall'output? –
UTF-16 utilizza unità a due byte per codificare i caratteri. Per i primi 65536 caratteri Unicode (il cosiddetto Piano 0), usa una di quelle unità, per tutto il resto, usa due (cioè, 4 byte, ma si distingue in due * caratteri surrogati * codificati ciascuno su due byte) . I caratteri ASCII formano i primi 128 caratteri Unicode, quindi sono codificati usando due byte, il più significativo è sempre lo 0, il meno significativo uguale al codice ASCII del personaggio. Qui vedi che ogni codice ASCII è seguito da un byte nullo, quindi stai avendo il byte di ordine inferiore, cioè UTF-16LE. –