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