如何在 PosteRazor 使用的文本编码中找到文件的路径?

如何在 PosteRazor 使用的文本编码中找到文件的路径?

波斯特剃须刀使用明显过时的 GUI,无法正确显示我的文件名:

PosteRazor - 加载输入图像

为了方便起见,我希望能够通过从 Nautilus 复制并粘贴其路径来在 PosteRazor 中打开任何文件。这在其他应用程序中有效,但遗憾的是,PosteRazor 无法理解该路径:

PosteRazor - 加载输入图像

如何将 Nautilus 生成的路径转换为与 PosteRazor 兼容的文本编码?

PosteRazor 的 Ubuntu 软件包列出了对 Fast Light Toolkit (FLTK) 的依赖。其程序员关于 Unicode 的文档看起来它可能包含回答我的问题所需的信息,但我不确定如何解释它。

细节

  • 一些示例内容:

    • Nautilus 中原生显示的路径:

      /home/ak/café/north-america.jpg
      
    • 与 PosteRazor 中本机显示的路径相同:

      PosteRazor 中显示的路径 <code>/home/ak/café/north-america.jpg</code>

    • 从 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:

      PosteRazor,OK 按钮处于活动状态

    • 从 PosteRazor 复制并粘贴到 Chromium 中的路径:

      /home/ak/café/norrth-america.jpg
      
    • 从 PosteRazor 复制并粘贴到 Chromium 中的路径,然后从 Chromium 复制并粘贴回 PosteRazor 中:

      PosteRazor,OK 按钮处于活动状态

    • 从 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 终端的路径:

      路径在 GNOME 终端中正确显示

    • 从 PosteRazor 复制并粘贴到 GNOME 终端的路径,然后从 GNOME 终端复制并粘贴回 PosteRazor:

      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 代码点混乱了。现在我们有两个代码点(c3a9),而应该只有一个(e9)。

毫不奇怪,这两个代码点即U+00C3U+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 来选择文件。


来源和更多信息:

相关内容