Как я могу найти путь файла в текстовом кодировании используемым PosteRazor?

PosteRazor использует по-видимому устаревший GUI, который неспособен к надлежащему отображению моих имен файлов:

PosteRazor - Load an input image

Ради удобства я хочу смочь открыть любой файл в PosteRazor путем копирования и вставки его пути от Наутилуса. Это работает в других приложениях, но к сожалению, PosteRazor не может понять путь:

PosteRazor - Load an input image

Как я могу преобразовать путь, который Наутилус генерирует в текст, кодирующий, который совместим с PosteRazor?

Пакет Ubuntu для PosteRazor перечисляет зависимость от Быстрого Легкого Инструментария (FLTK). Документация его программиста относительно Unicode похожа на него, мог бы содержать необходимую информацию для ответа на мой вопрос, но я не уверен, как интерпретировать его.

Подробнее

  • Некоторое демонстрационное содержание:

    • Путь, поскольку это исходно появляется в Наутилусе:

      /home/ak/café/north-america.jpg
      
    • Тот же путь, поскольку это исходно появляется в PosteRazor:

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

    • Содержание буфера обмена после копирования пути от Наутилуса:

      $ 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
      
    • Содержание буфера обмена после копирования пути от 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 после копирования пути от Наутилуса и вставки его в PosteRazor:

      PosteRazor with OK button grayed out

    • PosteRazor после копирования пути от PosteRazor и вставки его в PosteRazor:

      PosteRazor with OK button active

    • Путь скопирован с PosteRazor и вставлен в Хром:

      /home/ak/café/norrth-america.jpg
      
    • Путь скопирован с PosteRazor и вставлен в Хром и затем скопированный с Хрома и вставляемый назад в PosteRazor:

      PosteRazor with OK button active

    • Содержание буфера обмена после копирования этого от Хрома:

      $ 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
      
    • Путь скопирован с PosteRazor и вставлен в Терминал GNOME:

      Path appears correctly in GNOME Terminal

    • Путь скопирован с PosteRazor и вставлен в Терминал GNOME и затем скопированный с Терминала GNOME и вставляемый назад в PosteRazor:

      PosteRazor with OK button grayed out

    • Содержание буфера обмена после копирования этого от Терминала 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
задан 13 April 2017 в 05:25

1 ответ

Обновление: Следующая команда может использоваться:

xclip -out -selection clipboard -target STRING | iconv --from-code ISO-8859-15 --to-code UTF-8 | xclip -in -selection clipboard

Поскольку объяснение прочитало полный ответ.


Для завершенного понимания ответа у Вас должно быть понимание кодовых точек Unicode и кодирования unicode.

Ниже короткие определения и объяснения необходимых условий, но я рекомендую читать о них из источников, упомянутых в конце ответа.

  • Пространство Кода Unicode: диапазон целых чисел от 0 до 10FFFF16.

  • Кодовые точки Unicode: Любое значение в Unicode codespace. Кодовая точка соответствует символу, хотя не все кодовые точки присвоены закодированным символам.

  • UTF-8: UTF-8 (Формат Преобразования UCS - 8-разрядный) является переменной шириной, кодирующей, который может представить каждый символ в наборе символов Unicode. UCS обозначает Универсальный набор символов.

    Для первых 128 символов (US-ASCII) нужен один байт. Для следующих 1 920 символов нужны два байта для кодирования. Это покрывает остаток почти от всех полученных из латыни алфавитов, и также греческий язык, кириллицу, коптский, армянский, иврит, арабский, сирийский и алфавиты Tāna, а также Комбинирующий Диакритические знаки.

    Это указывает что символ é то, которое вызывает проблемы, берет два байта для кодирования в UTF-8. Мы проверим его с помощью некоторых команд.

  • ISO/IEC 8859-15: 8-разрядные однобайтовые кодированные графические наборы символов.


Для тестирования я сделал каталог /home/green/Pictures/café/.

После копирования местоположения от nautilus, выводы команд были следующие:

Команда № 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

Обратите внимание что кодирование café 63 61 66 e9, который в порядке как Кодовая точка Unicode, U+00E9 представляет {LATIN SMALL LETTER E WITH ACUTE} или é.

Команда № 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

В вышеупомянутом выводе, café кодируется как 63 61 66 c3 a9. Это в порядке также потому что кодировка UTF-8 кодовой точки U+00E9 (соответствие é) \xC3\xA9 (\x используется для представления этого, следующие символы являются шестнадцатеричными числами).

\xC3 представляет 1 байт и так делает \xA9. Таким образом UTF-8 нужны 2 байта для представления é.

После копирования того же текста от PosteRazor выводы команд были:

Команда № 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

Очевидно, Кодовые точки Unicode испорчены. Теперь, у нас есть две кодовых точки (c3 и a9) где должен быть только один (e9).

Неудивительно, эти две кодовых точки т.е. U+00C3 и U+00A9 поддержите {LATIN CAPITAL LETTER A WITH TILDE} И {COPYRIGHT SIGN}, который является тем, в чем мы видели PosteRazor.

Команда № 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

Вывод для этой команды, кажется, остался неизменным, но существует тонкое различие.

В предыдущем выводе \xc3\xa9 сформированный отдельный символ, тогда как теперь \xc3 формы один символ самостоятельно и \xa9 формы другой символ (которые являются Ã и ©, соответственно).


Теперь мы знаем то, что происходит, но как это происходит? Для моделирования того же самого мы будем использовать Python. Я использую Python 3.3.0 здесь.

>>> import 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'

Вы видите, что, если мы сначала кодируем строку с помощью UTF-8 и затем декодируем использование ISO-8859-15, затем мы получаем ту же строку, которую мы получаем при использовании PosteRazor.

Теперь, заметьте следующий код. Здесь также, мы скопировали и вставили местоположение от наутилуса:

>>> 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é'

Если бы мы закодировали строку с помощью ISO-8859-15 первоначально, то мы получили бы идеальный результат.

Отметьте это \xe9 кодирование для é в ISO-8859-15, которому, по-видимому, нужен один байт. Это совпадает с кодовой точкой Unicode U+00E9, который при кодировании в UTF-8 нуждается в 2 байтах и представлен \xc3\xa9.

Теперь, когда мы знаем, какой и как все продолжается, как мы исправляем его? Ну, можно или преобразовать пути к набору символов ISO-8859-15, или можно просто использовать GUI для выбора файлов.


Источники и дополнительная информация:

4
ответ дан 23 November 2019 в 09:38

Другие вопросы по тегам:

Похожие вопросы: