この質問の根本原因は、Perl用の新しいオプション/引数処理モジュール(OptArgs)のテストを書くことです。これはもちろん、私がthis質問への回答に基づいて行っている@ARGV
の解析です。これはI18N :: Langinfo :: CODESETが定義されているシステムでうまく動作します[1]。Perlでユニコード引数を外部コマンドに渡すにはどうすればよいですか?
langinfo(CODESET)
が利用できないシステムでは、少なくとも観察された動作に基づいて最善の努力をしたいと思います。しかし、私のテストでは、これまでのところ、一部のシステムでは、もの外部スクリプトへのunicode引数を正しく渡すことができないことが示されています。
私は「test_scriptは」単にprint Dumper(@ARGV)
をするPerlスクリプトである様々なシステム上で、次のようなものを実行するために管理している:
use utf8;
my $utf8 = '¥';
my $result = qx/$^X test_script $utf8/;
私は何を発見したことはFreeBSD上でtest_scriptがどのバイトを受信することですPerlの内部形式にデコードすることができます。しかし、OpenBSDとSolaris上でtest_scriptは、ユニコード置き換え文字(2回の?)だけを含む文字列"\x{fffd}\x{fffd}"
を取得するように見えます。
私はqx
オペレータの基礎となるメカニズムについてはわかりません。私はexec
やシェルを外していると推測しますが、ファイルハンドルと違って(私はそれらをエンコードのためにbinmodeすることができます)、私はそれが私が望むことを確実にする方法を知らない。その点についてはsystem()
と同じです。だから私の質問は私が上記のことを正しくしていないのですか?さもなければ、OpenBSDとSolarisのPerlやシェル、環境とは何が違うのですか?
[1]実際には私はこれまでのところCPANテスターの結果によるとLinuxだと思います。
アップデート(×2):私は現在、次はSchwernにの仮説をテストするcpantesterのセットアップを通して方法を実行しています
use strict;
use warnings;
use Data::Dumper;
BEGIN {
if (@ARGV) {
require Test::More;
Test::More::diag("\npre utf8::all: "
. Dumper({ utf8 => $ARGV[0], bytes => $ARGV[1] }));
}
}
use utf8;
use utf8::all;
BEGIN {
if (@ARGV) {
Test::More::diag("\npost utf8::all: "
. Dumper({ utf8 => $ARGV[0], bytes => $ARGV[1] }));
exit;
}
}
use Encode;
use Test::More;
my $builder = Test::More->builder;
binmode $builder->output, ':encoding(UTF-8)';
binmode $builder->failure_output, ':encoding(UTF-8)';
binmode $builder->todo_output, ':encoding(UTF-8)';
my $utf8 = '¥';
my $bytes = encode_utf8($utf8);
diag("\nPassing: " . Dumper({ utf8 => $utf8, bytes => $bytes, }));
open(my $fh, '-|', $^X, $0, $utf8, $bytes) || die "open: $!";
my $result = join('', <$fh>);
close $fh;
ok(1);
done_testing();
を、彼らが通ってくるとき、私は様々なシステム上で結果を投稿します。この妥当性や正しさについてのコメントは感謝の意を表します。有効なテストであることを意図しているのはではなく、であることに注意してください。上記の目的は、異なるシステムで受信されたものを比較できるようにすることです。
解決策:実際の根本的な問題は、私の質問やSchwernの答えで解決できないことが判明しました。私が発見したのは、cpantestersマシンの中にはasciiロケールだけがインストールされている/利用可能なものがあるということです。私はこのタイプの環境で動作するプログラムにUTF-8文字を渡す試みは期待できません。最終的に私の問題は無効なテスト条件であり、無効なコードではありませんでした。
qx
オペレータまたはutf8::all
モジュールが、パラメータが外部プログラムにどのように渡されるかに影響することは、これまで何も見ていません。重要なコンポーネントは、実行中のロケールを外部プログラムに知らせるために、LANG
および/またはLC_ALL
のように見えます。
ちなみに、私のコードはI18N :: Langinfo :: CODESETが定義されていますが間違っています。
関連するノートでは、BSDは他の方法で壊れているようです。私はFreeBSDへのsshセッションを通じてユニコード文字を入力することさえできません。その結果、奇妙な端末動作が起こります。 –
unicode-via-sshは、使用している端末と両方のシステムで 'TERM'が何をしているかによって大きく左右されます。 – sarnold
OS Xで問題を再現することはできませんが、[utf8 :: all](https://metacpan.org/module/utf8::all)を試して、Unicodeを含むほとんどのUnicode機能を有効にしてみてください'@ ARGV'。 'qx'は、' utf8 :: all'がファイルハンドルをUnicodeにする 'open'プラグマの影響を受けるかもしれません。 – Schwern