bug στην tr???
Αλέξανδρος Διαμαντίδης
adia at hellug.gr
Wed Feb 4 01:25:15 EET 2009
* Nick Demou [2009-02-01 22:54]:
> δοκιμάστε την παρακάτω εντολή σε utf-8 locale (το "ο" στο "οπ" είναι
> όμικρον ελληνικό )
>
> # echo "ό" | tr όπ οπ
[...]
> # echo -n "ό" | tr όα οα | hexdump -C
> 00000000 ce bf |..|
Ή ακόμα:
* echo αβγδεζ | tr άἀἁ φχψω
ϱϲϳϴϵ϶
Τα αποτελέσματα που παίρνεις οφείλονται στο ότι το tr δεν ξέρει
από χαρακτήρες και ουσιαστικά δουλεύει με bytes. Δεδομένου ότι οι ελληνικοί
χαρακτήρες σε UTF-8 είναι 2 bytes ο καθένας, απλώς είναι θέμα σύμπτωσης
ότι παρατήρησες το πρόβλημα μόνο με το "ό".
* echo όπ οπ | hexdump -C
00000000 cf 8c cf 80 20 ce bf cf 80 0a |.... .....|
0000000a
Αν όντως το tr δουλεύει με bytes, σύμφωνα με τα παραπάνω η εντολή «tr όπ
οπ» θα κάνει μόνο την εξής μετατροπή: <8c> -> <bf>. Το byte <cf>
εμφανίζεται δύο φορές, και το tr κρατάει την τελευταία εμφάνισή του, που
όμως το αντιστοιχίζει στον εαυτό του, και έτσι δεν αλλάζει. Πραγματικά:
* echo ό | hexdump -C
00000000 cf 8c 0a |...|
* echo ό | tr όπ οπ | hexdump -C
00000000 cf bf 0a |...|
Το "ό" που σε UTF-8 αντιστοιχεί στην ακολουθία bytes <cf 8c>,
μετατρέπεται στην ακολουθία <cf bf>, που όμως δεν είναι έγκυρο UTF-8 και
το τερματικό το δείχνει σαν τετραγωνάκι.
Η perl έχει τον τελεστή tr και υποστηρίζει UTF-8, οπότε μπορείς να
χρησιμοποιήσεις το εξής:
* echo "ό" | perl -M'encoding utf8' -pe 'tr /όπ/οπ/'
ο
Είμαι σίγουρος ότι θα υπάρχουν και πολλές άλλες λύσεις...
Αλέξανδρος
More information about the Linux-greek-users
mailing list