2016-08-22 5 views
3

私は、Ubuntu Linux(バージョン16.04でもこの場合は無関係です)で背景を取得して設定する簡単なスクリプトを作成しています。問題は、私のフォルダ名がUTF-8でエンコードされていることです(特に中国語)。このように、現在の壁紙へのパスを取得することのようなので、失敗します。perlのサブプロセスからUTF文字列を取得する

file:///home/xieerqi/%E4%B8%8B%E8%BD%BD/testimage.jpg 

そこで、質問です:

my $user_background=qx/gsettings get org.gnome.desktop.background picture-uri/; 

出力print $user_background私は適切にエンコードされたのですかどのようにシェルコマンドから/復号化された文字列

my $unicode_String=Encode::decode('utf-8', $user_background); 
:perlの

に私はこれを試していませんでした

が動作しませんでした。 binmode(STDOUT,":utf8");を追加

use utf8;がバックグラウンドで作業をして設定することと同じ文字列を使用して、不思議

を動作しませんでした追加

を助けにはなりませんでした。

+1

URLを要求したため、 '%E4%B8%8B'は** URLエンコードされています**。URLを構成する文字はすでに7ビットのASCII文字なので、UTF-8でデコードすると何も表示されません。 URLが必要なので、適切なパスが必要な場合はURLをデコードしてから、UTF-8デコードを適用する必要があります。 – nneonneo

+0

@mneonneo OK、どうすればURLデコードできますか? 'gsettings list-recursively org.gnome.desktop.background'を実行すると、' picture-uri'というキーが1つしかないことがわかります。デコードするオプションはありません –

+0

これまでのところ、多くのヒントがありますこれはURLエンコードされています。はい、私はそれを取得します。しかし、そのURLをデコードする方法は何ですか?どのように適切な答えのように見えないかを示すことなく "魚に行く"と言うだけです。 –

答えて

4

URLからパスを抽出するように思えます。ワンライナーとして

use open ':std', ':locale'; 
use feature qw(say); 

use Encode  qw(decode_utf8); 
use URI   qw(); 
use URI::Escape qw(uri_unescape); 

my $url = URI->new('file:///home/xieerqi/%E4%B8%8B%E8%BD%BD/testimage.jpg'); 

$url->scheme eq 'file' 
    or die("Invalid input\n"); 

my $path = decode_utf8(uri_unescape($url->path)); 

say $path; 

perl -CS -MEncode=decode_utf8 -MURI -MURI::Escape=uri_unescape \ 
    -e'CORE::say(decode_utf8(uri_unescape(URI->new($ARGV[0])->path)))' \ 
     file:///home/xieerqi/%E4%B8%8B%E8%BD%BD/testimage.jpg 

前のスニペットがUTF-8の端末を想定しているので、我々としても、デコードし、事実上、すぐにそれを次のエンコーディングを避けるかもしれません

perl -MURI -MURI::Escape=uri_unescape \ 
    -e'CORE::say(uri_unescape(URI->new($ARGV[0])->path))' \ 
     file:///home/xieerqi/%E4%B8%8B%E8%BD%BD/testimage.jpg 
+0

うまくいき、ありがとう –

4

それは私に正しいようです。文字はUTF-8でエンコードされてURLエンコードされているため、URLでファイルを正しく識別する必要があります。あなたは%E4%B8%8B%E8%BD%BD

- `E4 B8 8B`, which is the character U+4E0B or 下 

- `E8 BD BD`, which is the character U+8F7D or 载 

下载に対応した文字列は、「ダウンロード」でそれを

を読むことができるように期待すべきではありません。そうですか?

文字列で実際に何をしたいですか? picture-uriの代わりにpicture-filenameを使用すると、わかりやすいものが得られるかもしれません。

+0

はい、正しい文字列です。私は 'gsettings'の出力をプリントアウトしようとしていました。 Gsettingsは何らかの奇妙な理由でデコードされていない文字列を出力することが分かります。 see my post –

+0

'picture-filename'は動作しません、gsettingsスキーマは' picture-uri'キーしか持っていません。それは私にはあてはまりません –

+1

@Serg:URIを要求したので、UTF-8をURLエンコードする以外に選択肢はありませんでした。それ以外は有効なURIではありません。 – Borodin

0

したがって、問題は明らかにgsettingsとなりました。コマンドラインであっても、デコードされていない中国語の文字列を返します。環境を強制的に、それは

$ LC_ALL=C gsettings get org.gnome.desktop.background picture-uri               
'file:///home/xieerqi/%E4%B8%8B%E8%BD%BD/ad32d5d0615e9572-121171d86d0c8618-e11082638606a82c303fee0b29697811.jpg' 

しかし、同じ文字列を返す場合でも

$ gsettings get org.gnome.desktop.background picture-uri                 
'file:///home/xieerqi/%E4%B8%8B%E8%BD%BD/ad32d5d0615e9572-121171d86d0c8618-e11082638606a82c303fee0b29697811.jpg' 

は、スカラーになりサブプロセスの出力との適切な方法は、decode_utf8()メソッドを使用しているようです。基本的にここで試したことがあり、正常に出力されました。

#!/usr/bin/env perl 

use strict; 
use warnings; 
use utf8; 
use Encode; 
my $stuff=qx/ls ~ /; 
my $utf_string = decode_utf8($stuff); 
print "$utf_string"; 
+0

他の人がすでに説明したように、あなたが示唆しているようにgsettingsが壊れているという問題ではなく、URIを与えるように頼んだことです。つまり、URIエンコードされた文字列を取得します。 – ThisSuitIsBlackNot

+0

私は 'gsettings'が壊れていることを示唆していませんでした。私は単にデコードされていない文字列を返すと言っていました。 OK、どうすればURIをデコードできますか?チュートリアルや別のSOの投稿を教えていただけますか? –

+0

[URI :: Escape](https://metacpan.org/pod/URI::Escape) – ThisSuitIsBlackNot

関連する問題