ClickHere

uitvindingen

Sinkel

Je webshop staat als een huis met Sinkel: een online applicatie waarmee je een nieuwe webshop kunt bouwen of je bestaande webshop kunt uitbreiden met nieuwe functionaliteiten.

Murdoch

Murdoch is een framework dat de orderafhandeling volledig administreert en rapporteert. Vanaf het moment dat de klant bestelt, tot het moment dat de vervoerder de bestelling bij hem aflevert.

Coster

Redacties van vaktijdschriften kunnen hun werkproces met Coster grotendeels automatiseren. Vanaf inschrijving tot publicatie: Coster organiseert het proces, beheert de inkomende informatie en de beoordelingen.

Plantijn

Met Plantijn kunnen uitgevers en webredacties content online beheren. Contentmanagement wordt liederlijk eenvoudig. Publicatie is in eerste instantie op het web, maar je kunt er ook een printbare variant van maken.

Alle uitvindingen
uitvinders

Is de directeur/baas, maar wil dat liever niet. Hij houdt veel te veel van de techniek.

Joep

Biochemicus, knutselaar

Sjoerd

Developer, muzikant, filosoof

Sjors

Developer, wielrenner en fröbelaar

Freddy

Developer, doctorandus, bakker

Pepijn

Duizendpoot, regelneef, kwartiermaker

Ellen

Boekhouder, fysiotherapeut en grootaandeelhouder van Clickhere

Jolien

Developer, fotograaf en cartograaf

Jip

Informatieanalist en criticus

Felicity

Navigator, motormuis, piloot

Joris

Ontwikkelaar, coach, voorelkaarkrijger

Bas

Programmeur, communicator, eeuwige student

Thomas

Alle uitvinders
lab

Unicode equivalence filename problem

Geschreven op 24 mei 2012 door Freddy

I have a ZIP-file containing this file:

    Gabriëls.jpeg

The ZIP-file also contains an XML-file referencing this file:

    Gabri%C3%ABls.jpeg

Which can be decoded like this:

    $ ruby -e 'require "uri"; puts URI.unescape("Gabri%C3%ABls.jpeg")'
    Gabriëls.jpeg

Problem: The names are different:

    $ ls Gabriëls.jpg
    Gabriëls.jpg
    $ ls $(ruby -e 'require "uri"; puts URI.unescape("Gabri%C3%ABls.jpeg")')
    ls: cannot access Gabriëls.jpeg: No such file or directory

This is because of Unicode equivalence; the original ë is composed of two Unicode characters (press `ga' in Vim with cursor on char):

    <e>  101,   Hex 65,  Octal 145
    < ̈>  776, Hex 0308, Octal 1410

Whereas the url-encoded ë consists of just *one* Unicode character:

    <ë> 235, Hex 00eb, Octal 353

The difference between the Unicode representations can also be seen like this:

    $ printf Gabriëls.jpeg | od -abc # Original filename
    0000000   G   a   b   r   i   e   L  bs   l   s   .   j   p   e   g
            107 141 142 162 151 145 314 210 154 163 056 152 160 145 147
              G   a   b   r   i   e 314 210   l   s   .   j   p   e   g
    0000017
    $ printf Gabriëls.jpeg | od -abc # Url-encoded filename
    0000000   G   a   b   r   i   C   +   l   s   .   j   p   e   g
            107 141 142 162 151 303 253 154 163 056 152 160 145 147
              G   a   b   r   i 303 253   l   s   .   j   p   e   g
    0000016

The url-encoded code point (%C3%AB) seems to differ from when I do the url-encoding myself (%CC%88):

    $ ruby -e 'require "uri"; puts URI.escape("Gabriëls.jpeg")'
    Gabrie%CC%88ls.jpeg

Yes, this translates all right into the original:

    $ ruby -e 'require "uri"; puts URI.unescape("Gabrie%CC%88ls.jpeg")'
    Gabriëls.jpeg


Solution (theoretical): Make `ls' (or any filename lookup) consider the two filenames equivalent?[2]

Workaround 1: The XML-file actually contains two references to the file, a `src' and an `alt' attribute.  The `alt' attribute seems to contain the same Unicode code points as the actual filename, contrary to the `src' attribute.  So if `src' fails, I'll try `alt'.

Workaround 2: Ask the ZIP-file creator to not use different code points for the same character.  I think the ZIP-file with the XML-reference was created on a Mac...

Workaround 3: As the OS doesn't handle the equivalency, handle it at the program-level (php/python/ruby) :-(

See also: 

  1. Unicode equivalence - Wikipedia
  2. Ned Batchelder: Filenames with accents
  3. Fixing Unix/Linux/POSIX Filenames: Control Characters (such as Newline), Leading Dashes, and Other Problems