Potrzebuję uzyskać znak ASCII dla każdego znaku w ciągu znaków. Właściwie jest to każda postać w (małym) pliku. Poniższe 3 pierwsze linie z powodzeniem wyciągnąć całą zawartość pliku jest na ciąg znaków (za this recipe):Tcl do uzyskania kodu ASCII dla każdego znaku w ciągu znaków
set fp [open "store_order_create_ddl.sql" r]
set data [read $fp]
close $fp
wierzę ja poprawnie wymagających kodu ASCII dla znaków (patrz http://wiki.tcl.tk/1497). Mam jednak problem z ustaleniem, jak zapętlić każdy znak w ciągu znaków.
Po pierwsze, nie sądzę, że poniższy jest szczególnie idiomatyczny sposób zapętlenia znaków w łańcuchu przy pomocy Tcl. Po drugie, co ważniejsze, zachowuje się niepoprawnie, wstawiając dodatkowy element między każdą postacią.
Poniżej znajduje się kod, który napisałem, aby działać na zawartość powyższej zmiennej "data", a następnie kilka przykładowych danych wyjściowych.
KOD:
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)"
}
WYJŚCIE:
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)
Nie wiem nic na temat TCL, ale to, co mogę powiedzieć z wyjścia, to to, że twój ciąg wejściowy jest w UTF-16, w szczególności UTF-16, little-endian, a nie ASCII. –
Arthur, doceniam ten komentarz, ale jestem bardzo ciekawy, aby wiedzieć, * jak * możesz powiedzieć, że to (jest to mały endian UTF-16) z wyjścia? –
UTF-16 używa jednostek dwubajtowych do kodowania znaków. Dla pierwszych 65536 znaków Unicode (tak zwany Płaszczyzna 0) używa jednej z tych jednostek, dla wszystkich pozostałych używa dwóch (tj. 4 bajtów, ale rozróżnia się na dwa * zastępcze znaki * zakodowane na dwóch bajtach) . Znaki ASCII tworzą pierwsze 128 znaków Unicode, dlatego są kodowane za pomocą dwóch bajtów, przy czym najważniejszym z nich jest zawsze 0, najmniej znaczący jest równy kodowi ASCII postaci. Tutaj widzisz, że po każdym kodzie ASCII występuje bajt zerowy, dlatego najpierw masz najmniejszy porządek bajtu, czyli UTF-16LE. –