Tcl-für immer der ASCII-code für jedes Zeichen in einem string
Ich brauche, um das ASCII-Zeichen für jedes Zeichen in einem string. Eigentlich ist es jedem Charakter eine (kleine) Datei. Die folgenden ersten 3 Zeilen erfolgreich ziehen Sie den Inhalt einer Datei in eine string - (pro dieses Rezept):
set fp [open "store_order_create_ddl.sql" r]
set data [read $fp]
close $fp
Ich glaube, ich bin richtig anspruchsvoll der ASCII code für das Zeichen (siehe http://wiki.tcl.tk/1497). Aber ich habe ein problem, herauszufinden, wie, um eine Schleife über jedes Zeichen in der Zeichenfolge.
Erstens glaube ich nicht, das folgende ist ein besonders idiomatischer Weise zum Durchlaufen von Zeichen in einem string mit Tcl. Zweitens und noch wichtiger ist, es verhält sich falsch, können Sie ein zusätzliches element zwischen den einzelnen Zeichen.
Unten ist der code, den ich geschrieben habe zu handeln, die den Inhalt des "data" - variable oben gesetzt, gefolgt von einigen Beispiel-Ausgabe.
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)"
}
AUSGABE:
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)
- Sie wissen nichts über die TCL -, aber was ich sagen kann, Sie aus der Ausgabe ist, dass Ihr input-string im UTF-16, speziell UTF-16 little-endian, nicht ASCII.
- Arthur, ich über die Bemerkung, aber ich bin sehr daran interessiert zu wissen, wie können Sie sagen, dass (es ist UTF-16 little-endian) aus der Ausgabe?
- UTF-16 verwendet zwei-byte-Einheiten zum Kodieren von Zeichen. Für die ersten 65536 Unicode-Zeichen (die sogenannte Ebene 0), verwendet es eins von diesen Einheiten, für alle anderen, es verwendet zwei (d.h. 4 bytes, sondern unterschieden sich in zwei Ersatzzeichen kodiert jeweils auf zwei bytes). Die ASCII-Zeichen, die ersten 128 Unicode-Zeichen, daher sind Sie verschlüsselt, wobei zwei bytes, das wichtigste ist immer 0, die niederwertigen gleich das Zeichen ist im ASCII-code. Hier sehen Sie, dass jedes ASCII-code, gefolgt von einem null byte, folglich sind Sie mit mindestens-order-byte zuerst, also UTF-16LE.
- Danke Arthur, das ist übersichtlicher als die Wikipedia-Artikel, die ich sah in der Zwischenzeit aus!
- Arthur, bitte betrachten Sie dieses schreiben als Antwort, sondern als Kommentar, und ich werde sicherlich upvote und auch wahrscheinlich annehmen; so können Sie gewinnen einen guten Ruf für Ihre Eingabe.
- PS...die Art, wie dieser zustande kam, war für mich, dass ich tatsächlich versuchen, durchsuchen Sie die Ausgabe mit PHP aber segfaults aufgetreten beim Versuch, die tokenisierung der Daten. Mit PHP habe ich festgestellt, dass es interne null-Zeichen, und ich dachte, es könnte zu tun haben mit der übertragung der Datei zunächst via Remote-Desktop und dann per SCP. Ich Schloss die letztere, so dass, um zu versuchen, um sicherzustellen, dass es war nicht, weil a) PHP und b) die übertragung über Remote Desktop habe ich dann hochgeladen TCLKit zum remote-desktop, so dass ich versuchen könnte, mit einer anderen Sprache, die direkt auf dem Rechner mit dem SQL-bekam generiert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgende code sollte funktionieren:
Soweit die zusätzlichen Zeichen in der Ausgabe, wie es scheint, das problem mit der Eingabe der Daten aus der Datei. Gibt es ein Grund gäbe es null-Zeichen (\0) zwischen den einzelnen Zeichen in der Datei?
Kam über diese ältere Frage, während etwas anderes suchen.. Geht zu beantworten, es für das wohl jemand anderes, möglicherweise auf der Suche nach einer Antwort auf diese Frage..
First off, zu verstehen, was Zeichen-Kodierungen werden. Die Quelle der Daten in das Beispiel ist NICHT-ASCII-Zeichen-Kodierung, also die ASCII-Zeichen (codes 0-127) wirklich keine Bedeutung haben-Außer in diesem Beispiel wird die Codierung wird als UTF-16, welches umfasst die ASCII-codes als eine Teilmenge. Was Sie wahrscheinlich wollen, ist die volle Palette von "Charakter" - codes von 0 bis 255, aber je nach Ihrem system, die Quelle der Daten, etc, die codes 128-255 werden kann, ANSI, ISO, oder einige andere seltsame code-Seite. Was Sie wollen, zu tun ist, konvertieren Sie die Daten in ein format, das Sie wissen, wie zu handhaben, wie das sehr Häufig der ISO 8859-1-code (Codierung "iso8859-1"), die sehr ähnlich zu den Windows-1252-standard-Kodierung (Kodierung "cp1252"), oder UTF-8 (Codierung "utf-8") mit den "encoding" - Befehl:
set data [convertto-Codierung utf-8 $data] ;# Für UTF-8
set data [convertto-Codierung iso8859-1 $data] ;# Für die ISO 8859-1
und so weiter. Wenn Sie das Lesen der Daten aus einer Datei, möchten Sie vielleicht, um den Datei-Codierung (über fconfigure) vor dem Auslesen der Daten als auch, um sicherzustellen, dass Sie das Lesen der Datei die Daten richtig. Schauen Sie die man-Seiten für "encoding" (und "fconfigure") für mehr details auf übergabe-Zeichensatz-Codierung.
Einmal haben Sie die Kodierung der Daten unter Kontrolle, der rest der Beispiel-code sollte funktionieren wie erwartet.