Tcl pour obtenir le code ASCII de chaque caractère dans une chaîne

J'ai besoin d'obtenir le caractère ASCII de chaque caractère dans une chaîne. Fait son de chaque caractère dans un (petit) fichier. Suivant les 3 premières lignes réussi à tirer tout le contenu du fichier dans une chaîne de caractères (par cette recette):

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

Je crois que je suis correctement éclairé le code ASCII pour les caractères (voir http://wiki.tcl.tk/1497). Cependant, je vais avoir un problème de trouver comment faire une boucle sur chaque caractère dans la chaîne.

Tout d'abord, je ne pense pas que la suite est particulièrement idiomatiques façon de boucler sur des caractères dans une chaîne de caractères avec Tcl. Deuxième et plus important encore, il se comporte de manière incorrecte, l'insertion d'un élément supplémentaire entre chaque personnage.

Ci-dessous le code que j'ai écrit à agir sur le contenu de "données" variable définie ci-dessus, suivie par quelques exemple de sortie.

CODE:

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)"
}

De SORTIE:

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)
  • Ne sais rien à propos de TCL, mais ce que je peux vous dire à partir de la sortie, c'est que votre chaîne d'entrée est au format UTF-16, spécifiquement UTF-16 little-endian, non ASCII.
  • Arthur, j'apprécie le commentaire, mais je suis très intéressé de savoir, comment pouvez-vous dire que (c'est de l'UTF-16 little-endian) à partir de la sortie?
  • UTF-16 utilise deux unités d'octets pour coder les caractères. Pour la première 65536 caractères Unicode (le soi-disant Plan 0), il utilise l'une de ces unités, pour tout le reste, il utilise les deux (c'est à dire, 4 octets, mais qui se distingue en deux substitution de caractères codés chacun sur deux octets). Les caractères ASCII forme les 128 premiers caractères Unicode, donc ils sont codés à l'aide de deux octets, le plus significatif étant toujours 0, le moins significatif de l'un égal au code ASCII du caractère. Ici, vous voyez que chaque code ASCII est suivie par un octet nul, donc vous avez moins octet de poids fort en premier, c'est à dire UTF-16LE.
  • Merci Arthur, c'est plus clair que celui de l'article de Wikipédia j'ai regardé dans l'intervalle!
  • Arthur, nous vous invitons à écrire ceci comme une réponse plutôt qu'un commentaire, et je vais certainement upvote et probablement aussi d'accepter, de sorte que vous pouvez acquérir une certaine réputation pour votre entrée.
  • PS...la façon dont cela s'est produit pour moi était que j'étais en train d'essayer d'analyser la sortie de PHP, mais a rencontré de segmentation lors de la tentative de marquer les données. Avec PHP, j'ai déterminé qu'il y a eu des caractères null, et j'ai pensé qu'il pourrait avoir à faire avec le transfert des fichiers, d'abord via le Bureau à Distance, puis via SCP. J'ai exclu le dernier, afin de les essayer pour être sûr qu'il n'était pas à cause d'un) de PHP, et b) le transfert via le Bureau à Distance, j'ai ensuite téléchargé TCLKit au bureau à distance, afin que je puisse essayer avec une autre langue, directement sur la machine où le SQL a obtenu généré.