Status changed to 'Confirmed' because the bug affects multiple users.

** Changed in: coreutils (Ubuntu)
       Status: New => Confirmed

-- 
You received this bug notification because you are a member of Ubuntu
Touch seeded packages, which is subscribed to coreutils in Ubuntu.
https://bugs.launchpad.net/bugs/875713

Title:
  cut fails to handle correctly utf-8

Status in coreutils package in Ubuntu:
  Confirmed

Bug description:
  1) I'm using Lucid :
  $ lsb_release -rd
  Description:  Ubuntu 10.04.3 LTS
  Release:      10.04

  2) The version of coreutils (that contains the 'cut' utility)
  $ apt-cache policy coreutils
  coreutils:
    Installé : 7.4-2ubuntu3
    Candidat : 7.4-2ubuntu3
   Table de version :
   *** 7.4-2ubuntu3 0
          500 http://fr.archive.ubuntu.com/ubuntu/ lucid-updates/main Packages
          100 /var/lib/dpkg/status
       7.4-2ubuntu2 0
          500 http://fr.archive.ubuntu.com/ubuntu/ lucid/main Packages

  3) What I expect to happen, as the man says:
  $man cut
  (...)
    -b, --bytes=LIST
      select only these bytes
    -c, --characters=LIST
      select only these characters
  (...)

  I expect a different behavior, when in 'not-1-byte' character sets
  such as UTF-8, UTF-16, etc...

  The same of different behavior we have with wc that says:
  $man wc
  (...)
    -c, --bytes
       print the byte counts
    -m, --chars
       print the character counts
  (...)

  So when I have on my environment :
  $ env | grep 'LANG'
  LANG=fr_FR.UTF-8
  GDM_LANG=fr_FR.UTF-8

  I can do:
  $ printf '%s' 'déjà vu' | wc -c
  9
  $ printf '%s' 'déjà vu' | wc -m
  7

  That is CORRECT (with wc) because as the ENV variable says I'm using
  UTF-8, the 'é' and 'à' count for 1 character but 2 bytes.

  
  4) What happens instead: I get something wrong with 'cut'
  $ printf '%s' 'déjà vu' | cut -b 1-4 | hd
  00000000  64 c3 a9 6a 0a                                    |d..j.|
  $ printf '%s' 'déjà vu' | cut -c 1-4 | hd
  00000000  64 c3 a9 6a 0a                                    |d..j.|

  (I piped it to 'hd', so that we have a better view of what's
  happening)

  It can even be worse and give an invalid UTF-8 output
  $ printf '%s' 'déjà vu' | cut -c 1-5 | hd
  00000000  64 c3 a9 6a c3 0a                                 |d..j..|

  That is because it 'cuts' in the middle of an UTF-8 sequence, and with the 
appended \n, it gives an incoherent UTF-8 sequence as we can prove:
  $ printf '%s' 'déjà vu' | cut -c 1-5 | iconv -f utf-8 -t iso8859-1
  d�jiconv: séquence d'échappement non permise à la position 4

  
  We can clearly see that -b or -c makes NO difference at all... but it should, 
as 'wc' does, because we are in UTF-8

  
  So either:
  -Option a) the cut program is buggy, mixes the concept of 'byte' of 
'character', and does things wrong when not in '1-byte' charset.
  -Option b) the help/man is wrong, and there is no difference when handling 
bytes and chars (but then why do we have two different options!)

  Note that some other GNU utilities seam to mix the concept of 'byte' and 
'char', but at least the misconception is clear in the man/help, for example 
with 'head'
  $man head
  (...)
   -c, --bytes=[-]N
       print the first N bytes of each file; with the leading `-', print all 
but the last N bytes of each file

  The -b option is unused for 'head', and yet they chosed to use -c,
  short of --bytes... Looks like they meant -c as --chars, but at the
  last moment decided to handle only bytes!

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/coreutils/+bug/875713/+subscriptions

-- 
Mailing list: https://launchpad.net/~touch-packages
Post to     : touch-packages@lists.launchpad.net
Unsubscribe : https://launchpad.net/~touch-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to