PosteRazor использует по-видимому устаревший GUI, который неспособен к надлежащему отображению моих имен файлов:
Ради удобства я хочу смочь открыть любой файл в PosteRazor путем копирования и вставки его пути от Наутилуса. Это работает в других приложениях, но к сожалению, PosteRazor не может понять путь:
Как я могу преобразовать путь, который Наутилус генерирует в текст, кодирующий, который совместим с PosteRazor?
Пакет Ubuntu для PosteRazor перечисляет зависимость от Быстрого Легкого Инструментария (FLTK). Документация его программиста относительно Unicode похожа на него, мог бы содержать необходимую информацию для ответа на мой вопрос, но я не уверен, как интерпретировать его.
Некоторое демонстрационное содержание:
Путь, поскольку это исходно появляется в Наутилусе:
/home/ak/café/north-america.jpg
Тот же путь, поскольку это исходно появляется в 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 после копирования пути от PosteRazor и вставки его в PosteRazor:
Путь скопирован с PosteRazor и вставлен в Хром:
/home/ak/café/norrth-america.jpg
Путь скопирован с PosteRazor и вставлен в Хром и затем скопированный с Хрома и вставляемый назад в PosteRazor:
Содержание буфера обмена после копирования этого от Хрома:
$ 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:
Путь скопирован с PosteRazor и вставлен в Терминал GNOME и затем скопированный с Терминала GNOME и вставляемый назад в PosteRazor:
Содержание буфера обмена после копирования этого от Терминала 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
Обновление: Следующая команда может использоваться:
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 для выбора файлов.
Источники и дополнительная информация: