web-dev-qa-db-ja.com

PosteRazorで使用されるテキストエンコーディングでファイルのパスを見つけるにはどうすればよいですか?

PosteRazor ファイル名を正しく表示できない明らかに古いGUIを使用しています:

PosteRazor - Load an input image

便宜上、Nautilusからパスをコピーして貼り付けることで、PosteRazorで任意のファイルを開くことができるようにしたいと考えています。これは他のアプリケーションでも機能しますが、残念ながら、PosteRazorはパスを理解できません。

PosteRazor - Load an input image

Nautilusが生成するパスをPosteRazorと互換性のあるテキストエンコーディングに変換するにはどうすればよいですか?

PosteRazorのUbuntuパッケージには、Fast Light Toolkit(FLTK)への依存関係が記載されています。その nicodeに関するプログラマーのドキュメント 私の質問に答えるために必要な情報が含まれているように見えますが、それをどのように解釈するかはわかりません。

詳細

  • いくつかのサンプルコンテンツ:

    • Nautilusにネイティブに表示されるパス:

      /home/ak/café/north-america.jpg
      
    • PosteRazorでネイティブに表示されるのと同じパス:

      The path <code>/home/ak/café/north-america.jpg</code> displayed in 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 with OK button grayed out

    • PosteRazorからパスをコピーしてPosteRazorに貼り付けた後のPosteRazor:

      PosteRazor with OK button active

    • PosteRazorからコピーされ、Chromiumに貼り付けられたパス:

      /home/ak/café/norrth-america.jpg
      
    • PosteRazorからコピーしてChromiumに貼り付け、次にChromiumからコピーしてPosteRazorに貼り付けたパス:

      PosteRazor with OK button active

    • 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ターミナルに貼り付けられたパス:

      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
ændrük

更新:次のコマンドを使用できます。

 xclip -out -selection clipboard -target STRING | iconv --from-code ISO-8859-15 --to-code UTF-8 | xclip -in -selectionクリップボード

説明については、完全な答えを読んでください。


答えを完全に理解するには、UnicodeコードポイントとUnicodeエンコーディングを理解している必要があります。

以下は必要な用語の簡単な定義と説明ですが、回答の最後に記載されているソースからそれらについて読むことをお勧めします。

  • Unicodeコードスペース:0から10FFFFまでの整数の範囲16

  • Unicodeコードポイント:Unicodeコードスペース内の任意の値。コードポイントは文字に対応しますが、すべてのコードポイントがエンコードされた文字に割り当てられるわけではありません。

  • UTF-8:UTF-8(UCS変換形式-8ビット)は可変幅エンコーディングを表すことができますUnicode文字セットのすべての文字。 UCSはUniversalCharacterSetの略です。

    最初の128文字(US-ASCII)には1バイトが必要です。次の1,920文字は、エンコードするために2バイトが必要です。これは、ほとんどすべてのラテン語由来のアルファベットのほか、ギリシャ語、キリル文字、コプト語、アルメニア語、ヘブライ語、アラビア語、シリア語、トーナ語のアルファベット、およびダイアクリティカルマークの組み合わせもカバーしています。

    これは、問題を引き起こしている文字éがUTF-8でエンコードするのに2バイトかかることを示しています。いくつかのコマンドを使用して確認します。

  • 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としてエンコードされています。コードポイントU + 00E9(éに対応)のUTF-8エンコーディングは\xC3\xA9\xは、次の文字が16進数であることを表すために使用されます)なので、これも問題ありません。 。

\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コードポイントはめちゃくちゃです。これで、2つのコードポイント(c3a9)があり、1つ(e9)だけが必要です。

当然のことながら、2つのコードポイント、つまりU+00C3U+00A9{LATIN CAPITAL LETTER A WITH TILDE} AND {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はそれ自体で1つの文字を形成し、\xa9は別の文字(é)を形成します。それぞれ)。


これで、whatが発生していることがわかりましたが、howは発生していますか?同じことをシミュレートするために、Pythonを使用します。ここではPython 3.3.0を使用しています。

 >>> import unicodedata 
 >>> a = u '/ home/green/Pictures/cafe' 
 >>> 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を使用しているときに取得したものと同じ文字列を取得することがわかります。

ここで、次のコードに注目してください。ここでも、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/cafe' 
 

最初にISO-8859-15を使用して文字列をエンコードした場合、完璧な結果が得られます。

\xe9はISO-8859-15のéのエンコーディングであり、明らかに1バイトが必要であることに注意してください。これは、UTF-8でエンコードされたときに2バイトを必要とし、\xc3\xa9で表されるUnicodeコードポイントU + 00E9と同じです。

何がどのように行われているのかがわかったので、どのように修正しますか?パスをISO-8859-15文字セットに変換するか、GUIを使用してファイルを選択することができます。


出典および詳細情報:

4
green