[gull] UTF-8 et les vieux utilitaires unix
Marc SCHAEFER
schaefer at alphanet.ch
Wed Jul 26 10:26:25 CEST 2006
On Wed, Jul 26, 2006 at 08:50:28AM +0200, Pierre Maitre wrote:
> Quelqu'un saurait-il comment "dire" à awk de parler UTF-8?
Il existe de nombreux packages awk sous Debian stable:
original-awk
mawk
gawk
ils peuvent tous être installés simultanément et c'est le système
d'`alternatives' qui décide de celui qui est actif à un moment donné.
Exemple:
schaefer at shakotay:~$ awk
schaefer at shakotay:~$ which awk
/usr/bin/awk
schaefer at shakotay:~$ ls -l `which awk`
lrwxrwxrwx 1 root root 21 Apr 8 18:25 /usr/bin/awk -> /etc/alternatives/awk
schaefer at shakotay:~$ ls -l /etc/alternatives/awk
lrwxrwxrwx 1 root root 13 Jun 12 11:33 /etc/alternatives/awk -> /usr/bin/mawk
schaefer at shakotay:~$ dpkg -S /usr/bin/mawk
mawk: /usr/bin/mawk
schaefer at shakotay:~$ /usr/sbin/update-alternatives --display awk
awk - status is auto.
link currently points to /usr/bin/mawk
/usr/bin/mawk - priority 5
slave nawk: /usr/bin/mawk
slave awk.1.gz: /usr/share/man/man1/mawk.1.gz
slave nawk.1.gz: /usr/share/man/man1/mawk.1.gz
Current `best' version is /usr/bin/mawk.
Il se pourrait qu'ils ne supportent pas tous l'UTF-8, même
partiellement.
Maintenant, pour ta question précise, d'après printf(3), %c produit
toujours *un* unsigned char, donc transcode simplement en un octet la
valeur passée en paramètre. Tu peux aussi transcoder de l'UNICODE via
%lc.
Quant à `man awk' il nous dit que printf %c affiche un caractère ASCII (donc
cela me semble clair).
Le support général UTF-8 semble limité. Par exemple, length(string)
donnera la longueur en bytes et non pas en caractère.
Même les fonctions chr() et ord() de gawk semblent ne travailler qu'en 8
bit.
En Perl c'est différent:
chr NUMBER
chr Returns the character represented by that NUMBER in the charac-
ter set. For example, "chr(65)" is "A" in either ASCII or Uni-
code, and chr(0x263a) is a Unicode smiley face. Note that
characters from 128 to 255 (inclusive) are by default not
encoded in UTF-8 Unicode for backward compatibility reasons
(but see encoding).
If NUMBER is omitted, uses $_.
For the reverse, use "ord".
Note that under the "bytes" pragma the NUMBER is masked to the
low eight bits.
See perlunicode and encoding for more about Unicode.
Il *semblerait* que si tu veux travailler véritablement en UNICODE avec
awk, il te faut convertir tes scripts en Perl ... ou passer par des
wrappers qui recode(1)nt en LATIN-1 avant de passer à la moulinette
UNICODE.
Personnellement je ne déploie pour le moment pas de UTF-8; et sur les
serveurs je laisse tout à POSIX/C, quitte à pour certaines applications
ajouter un LC_CTYPE adéquat.
More information about the gull
mailing list