1

「主力」であるスクリプトとMM.pl、それが読み取る単純な「パッチファイル」があります。この場合、パッチ ファイルは検索と置換のために .ini ファイルをターゲットにしています。十分に単純です。\0ini が各文字の間に null ( ) 文字でエンコードされていることに気付くのに 5 日かかりました。use::それ以来、コード スニペット、関数、正規表現の両方で見つけられるすべてのオプションを試しました。私がそれを見つけた唯一の理由はuse Data::Printer;、いくつかの値をダンプしていたからです。Notepad++ では、ini は USC-2 LE としてエンコードされているようです。MM.plユーザーに問題を「修正」するよう求めるのではなく、タスクを処理することが重要です。

更新: これにより、\xFF\xFE が ini ファイルの最初の 2 文字であるという手がかりが得られる場合があります。それらは処理後に表示されます。スワップは、実際には想定されているように他に何も変更していませんが、2 つの隠し文字を「明らかに」しています。

4

3 に答える 3

8

お気づきのように、これらのヌルは、削除するだけのジャンクではありません。それらはファイルの文字エンコーディングの一部です。だからそれをデコードします:

open my $fh, '<:encoding(UCS-2)', 'file.ini';

終わったら同じように書き直します。

于 2013-10-28T04:50:11.377 に答える
1

ファイルを読み取るときにエンコーディングを設定します

my $fh = IO::File->open( "< something.ini" );
binmode( $fh, ":encoding(UTF-16LE)" );

そして、出力するときは、好きなエンコーディングで書き戻すことができます。例えば

my $out = IO::File->open( "> something-new.ini" );
binmode( $out, ":encoding(UTF-8)" );

または、端末にダンプしている場合でも

binmode( STDOUT, ":encoding(UTF-8)" );
于 2013-10-28T04:51:56.163 に答える
0

正直に言うと、これは本当に解決策ではなく、失敗です。メソッドの試行と再試行、および読み取りと読み取りと読み取りの4週間後、私はそれを公園に置き、Pythonに切り替えてアプリを構築しました。perldocs のいくつかの参考文献では、UTF16 が「問題あり」であると言及されており、言及されている状況では別の方法で扱われます。

于 2013-11-05T07:54:30.777 に答える