この質問の根本的な原因は、Perl用の新しいオプション/引数処理モジュール ( OptArgs ) のテストを作成しようとしたことです。もちろん、これには、この@ARGV
質問への回答に基づいて行っている解析が含まれます。これは、I18N::Langinfo::CODESET が定義されているシステムで問題なく動作します[1]。
が利用できないシステムでlanginfo(CODESET)
は、少なくとも観察された動作に基づいて最善を尽くしたいと思います。ただし、これまでのテストでは、Unicode 引数を外部スクリプトに適切に渡すことさえできないシステムがあることを示しています。
「test_script」が単に実行するPerlスクリプトであるさまざまなシステムで、次のようなものを実行することができましたprint Dumper(@ARGV)
:
use utf8;
my $utf8 = '¥';
my $result = qx/$^X test_script $utf8/;
私が見つけたのは、FreeBSD では、test_script が Perl の内部形式にデコードできるバイトを受け取るということです。ただし、OpenBSD と Solaris では、test_script"\x{fffd}\x{fffd}"
は Unicode 置換文字 (2 回?) のみを含む文字列を取得するようです。
qx
オペレーターの根底にあるメカニズムがわかりません。私はexec
それが . それについては同じsystem()
です。私の質問は、上記で正しく行っていないことは何ですか? そうでなければ、Perl、シェル、または OpenBSD と Solaris の環境との違いは何ですか?
[1] 実際のところ、CPAN テスターの結果によると、これは Linux だけだと思います。
更新 (x2):私は現在、シュワーンの仮説をテストするために 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 が定義されているすべてのシステムで動作するという最初の主張は誤りでした。