波斯特剃须刀使用明显过时的 GUI,无法正确显示我的文件名:
为了方便起见,我希望能够通过从 Nautilus 复制并粘贴其路径来在 PosteRazor 中打开任何文件。这在其他应用程序中有效,但遗憾的是,PosteRazor 无法理解该路径:
如何将 Nautilus 生成的路径转换为与 PosteRazor 兼容的文本编码?
PosteRazor 的 Ubuntu 软件包列出了对 Fast Light Toolkit (FLTK) 的依赖。其程序员关于 Unicode 的文档看起来它可能包含回答我的问题所需的信息,但我不确定如何解释它。
细节
一些示例内容:
Nautilus 中原生显示的路径:
/home/ak/café/north-america.jpg
与 PosteRazor 中本机显示的路径相同:
从 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
从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
从 Nautilus 复制路径并将其粘贴到 PosteRazor 中后,PosteRazor:
从 PosteRazor 复制路径并将其粘贴到 PosteRazor 中后,PosteRazor:
从 PosteRazor 复制并粘贴到 Chromium 中的路径:
/home/ak/café/norrth-america.jpg
从 PosteRazor 复制并粘贴到 Chromium 中的路径,然后从 Chromium 复制并粘贴回 PosteRazor 中:
从 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
从 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
答案1
更新:可以使用以下命令:
xclip -out -选择剪贴板-目标字符串|iconv --来自代码ISO-8859-15 --到代码UTF-8|xclip -in -选择剪贴板
如需解释,请阅读完整答案。
要完全理解答案,您需要了解 Unicode 代码点和 unicode 编码。
以下是所需术语的简短定义和解释,但我建议您从答案末尾提到的来源阅读它们。
Unicode 代码空间:整数范围从 0 到 10FFFF 16。
Unicode 代码点:Unicode 代码空间中的任意值。一个代码点对应一个字符,但并非所有代码点都分配给编码字符。
UTF-8:UTF-8(UCS 转换格式 - 8 位)是可变宽度编码可以表示 Unicode 字符集中的每个字符。UCS 代表通用字符集。
前 128 个字符(US-ASCII)需要一个字节。接下来的 1,920 个字符需要两个字节进行编码。这涵盖了几乎所有拉丁字母的其余部分,以及希腊文、西里尔文、科普特文、亚美尼亚文、希伯来文、阿拉伯文、叙利亚文和塔纳文以及组合变音符号。
这表明导致问题的字符
é
在 UTF-8 中需要两个字节进行编码。我们将使用一些命令来验证它。ISO/IEC 8859-15:8 位单字节编码的图形字符集。
为了测试,我创建了一个目录/home/green/Pictures/café/
。
从 复制位置后nautilus
,命令的输出如下:
命令#1:
$ xclip -out -selection 剪贴板 -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 -选择剪贴板-目标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
。这也是可以的,因为 代码点U+00E9 (对应é
)的UTF-8编码是\xC3\xA9
(\x
用来表示后面的字符是十六进制数)。
\xC3
表示 1 个字节, 也表示 1 个字节\xA9
。因此,UTF-8 需要 2 个字节来表示é
。
PosteRazor
从命令输出中复制相同的文本后,结果如下:
命令#1:
$ xclip -out -selection 剪贴板 -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}
AND {COPYRIGHT SIGN}
,这就是我们在中看到的PosteRazor
。
命令 #2:
$ xclip -out -选择剪贴板-目标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。
>>> 导入 unicodedata >>> a = u'/home/green/Pictures/café' >>> 一个 '/home/green/Pictures/café' >>> a = a.encode('utf-8') >>> 一个 b'/home/green/图片/caf\xc3\xa9' >>> a = a.解码('iso-8859-15') >>> 一个 '/home/green/Pictures/café' >>> a = a.encode('utf-8') >>> 一个 b'/home/green/图片/caf\xc3\x83\xc2\xa9'
您可以看到,如果我们首先使用 UTF-8 对字符串进行编码,然后使用 ISO-8859-15 进行解码,那么我们得到与使用时相同的字符串PosteRazor
。
现在,请注意以下代码。这里我们也从 nautilus 复制并粘贴了位置:
>>> z = u'/home/green/Pictures/café' >>> 是 '/home/green/Pictures/café' >>> z = z.编码('iso-8859-15') >>> 是 b'/home/green/图片/caf\xe9' >>> z = z.解码('iso-8859-15') >>> 是 '/home/green/Pictures/café'
如果我们最初使用 ISO-8859-15 对字符串进行编码,我们就会得到完美的结果。
请注意,\xe9
是 ISO-8859-15 中的 编码é
,显然需要一个字节。这与 Unicode 代码点 U+00E9 相同,后者在 UTF-8 中编码时需要 2 个字节,表示为\xc3\xa9
。
现在我们知道了一切是怎么回事,我们如何纠正它?好吧,您可以将路径转换为 ISO-8859-15 字符集,也可以只使用 GUI 来选择文件。
来源和更多信息: