[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