PosteRazor ファイル名を正しく表示できない明らかに古いGUIを使用しています:
便宜上、Nautilusからパスをコピーして貼り付けることで、PosteRazorで任意のファイルを開くことができるようにしたいと考えています。これは他のアプリケーションでも機能しますが、残念ながら、PosteRazorはパスを理解できません。
Nautilusが生成するパスをPosteRazorと互換性のあるテキストエンコーディングに変換するにはどうすればよいですか?
PosteRazorのUbuntuパッケージには、Fast Light Toolkit(FLTK)への依存関係が記載されています。その nicodeに関するプログラマーのドキュメント 私の質問に答えるために必要な情報が含まれているように見えますが、それをどのように解釈するかはわかりません。
いくつかのサンプルコンテンツ:
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
更新:次のコマンドを使用できます。
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つのコードポイント(c3
とa9
)があり、1つ(e9
)だけが必要です。
当然のことながら、2つのコードポイント、つまりU+00C3
とU+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を使用してファイルを選択することができます。
出典および詳細情報: