web-dev-qa-db-fra.com

Comment trouver le chemin d'un fichier dans l'encodage de texte utilisé par PosteRazor?

PosteRazor utilise une interface graphique apparemment obsolète qui est incapable d'afficher correctement mes noms de fichiers:

PosteRazor - Load an input image

Par souci de commodité, je veux pouvoir ouvrir n'importe quel fichier dans PosteRazor en copiant et collant son chemin depuis Nautilus. Cela fonctionne dans d'autres applications, mais malheureusement, PosteRazor est incapable de comprendre le chemin:

PosteRazor - Load an input image

Comment puis-je convertir le chemin généré par Nautilus en un encodage de texte compatible avec PosteRazor?

Le package Ubuntu pour PosteRazor répertorie une dépendance sur le Fast Light Toolkit (FLTK). Son documentation du programmeur sur Unicode semble qu'il pourrait contenir les informations nécessaires pour répondre à ma question, mais je ne sais pas comment l'interpréter.

Détails

  • Quelques exemples de contenu:

    • Un chemin tel qu'il apparaît nativement dans Nautilus:

      /home/ak/café/north-america.jpg
      
    • Le même chemin qu'il apparaît nativement dans PosteRazor:

      The path <code>/home/ak/café/north-america.jpg</code> displayed in PosteRazor

    • Le contenu du presse-papiers après avoir copié le chemin depuis Nautilus:

      $ xclip -out -selection clipboard -target TARGETS
      TIMESTAMP
      TARGETS
      MULTIPLE
      x-special/gnome-copied-files
      text/uri-list
      UTF8_STRING
      COMPOUND_TEXT
      TEXT
      STRING
      text/plain;charset=utf-8
      text/plain
      $ xclip -out -selection clipboard -target STRING | hexdump -C
      00000000  2f 68 6f 6d 65 2f 61 6b  2f 63 61 66 e9 2f 6e 6f  |/home/ak/caf./no|
      00000010  72 74 68 2d 61 6d 65 72  69 63 61 2e 6a 70 67     |rth-america.jpg|
      0000001f
      $ xclip -out -selection clipboard -target UTF8_STRING | hexdump -C
      00000000  2f 68 6f 6d 65 2f 61 6b  2f 63 61 66 c3 a9 2f 6e  |/home/ak/caf../n|
      00000010  6f 72 74 68 2d 61 6d 65  72 69 63 61 2e 6a 70 67  |orth-america.jpg|
      00000020
      $ xclip -out -selection clipboard -target text/plain | hexdump -C
      00000000  2f 68 6f 6d 65 2f 61 6b  2f 63 61 66 5c 75 30 30  |/home/ak/caf\u00|
      00000010  65 39 2f 6e 6f 72 74 68  2d 61 6d 65 72 69 63 61  |e9/north-america|
      00000020  2e 6a 70 67                                       |.jpg|
      00000024
      $ xclip -out -selection clipboard -target 'text/plain;charset=utf-8' | hexdump -C
      00000000  2f 68 6f 6d 65 2f 61 6b  2f 63 61 66 c3 a9 2f 6e  |/home/ak/caf../n|
      00000010  6f 72 74 68 2d 61 6d 65  72 69 63 61 2e 6a 70 67  |orth-america.jpg|
      00000020
      
    • Le contenu du presse-papiers après avoir copié le chemin depuis PosteRazor:

      $ xclip -out -selection clipboard -target TARGETS
      STRING
      $ xclip -out -selection clipboard -target STRING | hexdump -C
      00000000  2f 68 6f 6d 65 2f 61 6b  2f 63 61 66 c3 a9 2f 6e  |/home/ak/caf../n|
      00000010  6f 72 74 68 2d 61 6d 65  72 69 63 61 2e 6a 70 67  |orth-america.jpg|
      00000020
      
    • PosteRazor après avoir copié le chemin depuis Nautilus et l'avoir collé dans PosteRazor:

      PosteRazor with OK button grayed out

    • PosteRazor après avoir copié le chemin depuis PosteRazor et l'avoir collé dans PosteRazor:

      PosteRazor with OK button active

    • Le chemin copié depuis PosteRazor et collé dans Chrome:

      /home/ak/café/norrth-america.jpg
      
    • Le chemin copié à partir de PosteRazor et collé dans Chromium, puis copié à partir de Chromium et collé à nouveau dans PosteRazor:

      PosteRazor with OK button active

    • Le contenu du presse-papiers après l'avoir copié depuis Chromium:

      $ xclip -out -selection clipboard -target TARGETS
      TIMESTAMP
      TARGETS
      MULTIPLE
      SAVE_TARGETS
      COMPOUND_TEXT
      STRING
      TEXT
      UTF8_STRING
      text/plain
      $ xclip -out -selection clipboard -target STRING | hexdump -C
      00000000  2f 68 6f 6d 65 2f 61 6b  2f 63 61 66 c3 a9 2f 6e  |/home/ak/caf../n|
      00000010  6f 72 72 74 68 2d 61 6d  65 72 69 63 61 2e 6a 70  |orrth-america.jp|
      00000020  67                                                |g|
      00000021
      $ xclip -out -selection clipboard -target UTF8_STRING | hexdump -C
      00000000  2f 68 6f 6d 65 2f 61 6b  2f 63 61 66 c3 a9 2f 6e  |/home/ak/caf../n|
      00000010  6f 72 72 74 68 2d 61 6d  65 72 69 63 61 2e 6a 70  |orrth-america.jp|
      00000020  67                                                |g|
      00000021
      $ xclip -out -selection clipboard -target text/plain | hexdump -C
      00000000  2f 68 6f 6d 65 2f 61 6b  2f 63 61 66 c3 a9 2f 6e  |/home/ak/caf../n|
      00000010  6f 72 72 74 68 2d 61 6d  65 72 69 63 61 2e 6a 70  |orrth-america.jp|
      00000020  67                                                |g|
      00000021
      
    • Le chemin copié depuis PosteRazor et collé dans le terminal GNOME:

      Path appears correctly in GNOME Terminal

    • Le chemin copié à partir de PosteRazor et collé dans GNOME Terminal, puis copié à partir de GNOME Terminal et collé à nouveau dans PosteRazor:

      PosteRazor with OK button grayed out

    • Le contenu du presse-papiers après l'avoir copié depuis le terminal GNOME:

      $ xclip -out -selection clipboard -target TARGETS
      TIMESTAMP
      TARGETS
      MULTIPLE
      SAVE_TARGETS
      UTF8_STRING
      COMPOUND_TEXT
      TEXT
      STRING
      text/plain;charset=utf-8
      text/plain
      $ xclip -out -selection clipboard -target STRING | hexdump -C
      00000000  2f 68 6f 6d 65 2f 61 6b  2f 63 61 66 e9 2f 6e 6f  |/home/ak/caf./no|
      00000010  72 74 68 2d 61 6d 65 72  69 63 61 2e 6a 70 67     |rth-america.jpg|
      0000001f
      $ xclip -out -selection clipboard -target UTF8_STRING | hexdump -C
      00000000  2f 68 6f 6d 65 2f 61 6b  2f 63 61 66 c3 a9 2f 6e  |/home/ak/caf../n|
      00000010  6f 72 74 68 2d 61 6d 65  72 69 63 61 2e 6a 70 67  |orth-america.jpg|
      00000020
      $ xclip -out -selection clipboard -target 'text/plain' | hexdump -C
      00000000  2f 68 6f 6d 65 2f 61 6b  2f 63 61 66 5c 75 30 30  |/home/ak/caf\u00|
      00000010  65 39 2f 6e 6f 72 74 68  2d 61 6d 65 72 69 63 61  |e9/north-america|
      00000020  2e 6a 70 67                                       |.jpg|
      00000024
      $ xclip -out -selection clipboard -target 'text/plain;charset=utf-8' | hexdump -C
      00000000  2f 68 6f 6d 65 2f 61 6b  2f 63 61 66 c3 a9 2f 6e  |/home/ak/caf../n|
      00000010  6f 72 74 68 2d 61 6d 65  72 69 63 61 2e 6a 70 67  |orth-america.jpg|
      00000020
      
5
ændrük

Mise à jour: La commande suivante peut être utilisée:

 xclip -out -selection presse-papiers -cible STRING | iconv - à partir du code ISO-8859-15 - au code UTF-8 | Presse-papiers xclip -in -selection 

Pour des explications, lisez la réponse complète.


Pour comprendre complètement la réponse, vous devez avoir une compréhension des points de code Unicode et du codage Unicode.

Vous trouverez ci-dessous de brèves définitions et explications des termes requis, mais je vous recommande de les lire dans les sources mentionnées à la fin de la réponse.

  • Espace de code Unicode: Une plage d'entiers de 0 à 10FFFF16.

  • Points de code Unicode: Toute valeur dans l'espace de code Unicode. Un point de code correspond à un caractère, bien que tous les points de code ne soient pas affectés à des caractères codés.

  • UTF-8: UTF-8 (Format de transformation UCS - 8 bits) est un encodage à largeur variable qui peut représenter chaque caractère du jeu de caractères Unicode. UCS signifie Universal Character Set.

    Les 128 premiers caractères (US-ASCII) nécessitent un octet. Les 1 920 caractères suivants ont besoin de deux octets pour être codés. Cela couvre le reste de presque tous les alphabets d'origine latine, ainsi que les alphabets grec, cyrillique, copte, arménien, hébreu, arabe, syriaque et tana, ainsi que la combinaison des signes diacritiques.

    Cela indique que le caractère é ce qui cause des problèmes prend deux octets pour encoder en UTF-8. Nous allons le vérifier à l'aide de quelques commandes.

  • ISO/CEI 8859-15: Jeux de caractères graphiques codés sur un octet.


Pour tester, j'ai fait un répertoire /home/green/Pictures/café/.

Après avoir copié l'emplacement depuis nautilus, les sorties des commandes étaient les suivantes:

Commande n ° 1:

 $ xclip -out -selection clipboard -target STRING | hexdump -C 
 00000000 2f 68 6f 6d 65 2f 67 72 65 65 6e 2f 50 69 63 74 |/home/green/Pict | 
 00000010 75 72 65 73 2f 63 61 66 e9 2f | ures/caf./| 
 0000001a 

Notez que l'encodage de café est 63 61 66 e9, ce qui est correct car le point de code Unicode U + 00E9 représente {LATIN SMALL LETTER E WITH ACUTE} ou é.

Commande n ° 2:

 $ xclip -out -selection clipboard -target UTF8_STRING | hexdump -C 
 00000000 2f 68 6f 6d 65 2f 67 72 65 65 6e 2f 50 69 63 74 |/home/green/Pict | 
 00000010 75 72 65 73 2f 63 61 66 c3 a9 2f | ures/caf ../ | 
 0000001b 

Dans la sortie ci-dessus, café est codé comme 63 61 66 c3 a9. C'est bien aussi parce que l'encodage UTF-8 du point de code U + 00E9 (correspondant à é) est \xC3\xA9 (\x est utilisé pour représenter que les caractères suivants sont des nombres hexadécimaux).

\xC3 représente 1 octet, tout comme \xA9. Ainsi, UTF-8 a besoin de 2 octets pour représenter é.

Après avoir copié le même texte depuis PosteRazor les sorties des commandes étaient:

Commande n ° 1:

 $ xclip -out -selection clipboard -target STRING | hexdump -C 
 00000000 2f 68 6f 6d 65 2f 67 72 65 65 6e 2f 50 69 63 74 |/home/green/Pict | 
 00000010 75 72 65 73 2f 63 61 66 c3 a9 2f | ures/caf ../ | 
 0000001b 

De toute évidence, les points de code Unicode sont foirés. Maintenant, nous avons deux points de code (c3 et a9) où il ne devrait y en avoir qu'un (e9).

Sans surprise, les deux points de code, c'est-à-dire U+00C3 et U+00A9 représenter {LATIN CAPITAL LETTER A WITH TILDE} ET {COPYRIGHT SIGN}, ce que nous avons vu dans PosteRazor.

Commande n ° 2:

 $ xclip -out -selection clipboard -target UTF8_STRING | hexdump -C 
 00000000 2f 68 6f 6d 65 2f 67 72 65 65 6e 2f 50 69 63 74 |/home/green/Pict | 
 00000010 75 72 65 73 2f 63 61 66 c3 a9 2f | ures/caf ../ | 
 0000001b 

La sortie de cette commande semble être restée inchangée, mais il existe une différence subtile.

Dans la sortie précédente \xc3\xa9 formait un seul caractère alors que maintenant \xc3 forme un seul caractère et \xa9 forme un autre caractère (qui sont à et ©, respectivement).


Maintenant, nous savons que quoi se produit, mais comment est-ce que cela se produit? Pour simuler la même chose, nous utiliserons Python. J'utilise Python 3.3.0 ici.

 >>> importation d'unicodedata 
 >>> a = u '/ home/green/Pictures/café' 
 >>> a 
 '/ home/green/Pictures/café '
 >>> a = a.encode (' utf-8 ') 
 >>> a 
 B'/home/green/Pictures/caf\xc3\xa9 '
 >>> a = a.decode (' iso-8859-15 ') 
 >>> a 
'/home/green/Pictures/cafà © '
 >>> a = a.encode (' utf-8 ') 
 >>> a 
 b'/home/green/Pictures/caf\xc3\x83\xc2\xa9 '

Vous pouvez voir que si nous encodons d'abord la chaîne en utilisant UTF-8 puis décodons en utilisant ISO-8859-15, alors nous obtenons la même chaîne que nous obtenons en utilisant PosteRazor.

Maintenant, notez le code suivant. Ici aussi, nous avons copié et collé l'emplacement depuis nautilus:

 >>> z = u '/ home/green/Pictures/café' 
 >>> z 
 '/ home/green/Pictures/café' 
 >>> z = z.encode ('iso-8859-15') 
 >>> z 
 b '/ home/green/Pictures/caf\xe9' 
> >> z = z.decode ('iso-8859-15') 
 >>> z 
 '/ home/green/Pictures/café' 
 

Si nous avions encodé la chaîne en utilisant ISO-8859-15 au départ, nous aurions obtenu le résultat parfait.

Notez que \xe9 est le codage pour é dans ISO-8859-15, qui nécessite apparemment un octet. C'est le même que le point de code Unicode U + 00E9 qui, lorsqu'il est codé en UTF-8, a besoin de 2 octets et est représenté par \xc3\xa9.

Maintenant que nous savons quoi et comment tout se passe, comment le corriger? Eh bien, vous pouvez soit convertir les chemins d'accès au jeu de caractères ISO-8859-15, soit utiliser l'interface graphique pour sélectionner des fichiers.


Sources et informations complémentaires:

4
green