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é.
Vous devez vous connecter pour publier un commentaire.
Le code suivant devrait fonctionner:
Autant que les caractères supplémentaires dans votre sortie, il me semble que le problème est avec votre entrée de données à partir du fichier. Est-il une raison, il y aurait des caractères null (\0) entre chaque caractère dans le fichier?
Suis tombé sur cette ancienne question tout en cherchant quelque chose d'autre.. Va répondre pour le bénéfice de quelqu'un d'autre qui peut être à la recherche d'une réponse à cette question..
Tout d'abord, comprendre ce que les encodages de caractères sont. La source de données dans l'exemple n'est PAS ASCII codage de caractères, de sorte que le caractère ASCII codes (codes 0 à 127) n'ont vraiment aucun sens, Sauf dans cet exemple, l'encodage semble être en UTF-16, qui comprend les codes ASCII comme un sous-ensemble. Ce que vous voulez probablement, c'est la gamme complète de "caractère" codes de 0 à 255, mais en fonction de votre système, la source des données, etc, codes 128 à 255 peuvent être ANSI, ISO, ou de certains autres étranges page de code. Ce que vous voulez faire est de convertir les données dans un format que vous savez comment le gérer, comme par exemple la commune de ISO 8859-1 code ("codage iso8859-1"), qui est très similaire à Windows 1252 norme d'encodage (encoding "cp1252"), ou de l'UTF-8 (encodage "utf-8") avec le "codage" de commande:
ensemble de données [encodage convertto utf-8 $data] ;# Pour l'UTF-8
ensemble de données [encodage convertto iso8859-1 $data] ;# l'ISO 8859-1
et ainsi de suite. Si vous êtes en train de lire les données à partir d'un fichier, vous pouvez définir l'encodage du fichier (via fconfigure) avant de lire les données ainsi, pour s'assurer que vous êtes en train de lire le fichier de données correctement. Rechercher les pages man de "codage" (et "fconfigure") pour plus de détails sur la remise codage du jeu de caractères.
Une fois que vous avez de l'encodage des données est sous contrôle, le reste de l'exemple de code devrait fonctionner comme prévu.