2017-12-22 13 views
1

私は次のコンテンツを持つファイル/tmp/xxx持っている:私は、ファイルの内容を読んで、それを印刷するとき「プリント時のワイド文字」を取り除く方法は?

00000000 D0 BA D0 B8 │ D1 80 D0 B8 │ D0 BB D0 B8 │ D0 BA  к и р и л и к 

を私はエラーを取得:

Wide character in print at ... 

ソースは次のとおりです。

use utf8; 
open my $fh, '<:encoding(UTF-8)', '/tmp/xxx'; 
print scalar <$fh> 

印刷物からの出力は:

кирилик 
+2

をご '使用utf8'は、ソースコードファイルは、それにUTF8の文字を持っているPerlを伝えます。あなたはutf8のサポートや 'binmode'サポートで' STDOUT'を開く必要があります。 – simbabque

+0

@simbabque:これは 'use utf8'とは関係ないようです。コードは完全にASCIIです。おそらく '/ tmp/xx'の最初の行には拡張文字が含まれています。 – Borodin

+0

私は@ボロディンを知っています。それが私の指摘でした。 – simbabque

答えて

6

あなたはUTF8を期待していないSTDOUTに印刷しています。 はすでに開かれたハンドルの上にそれを変更することが

binmode(STDOUT, "encoding(UTF-8)"); 

を追加します。

+3

'use open":std "、":encoding(UTF-8) ";これはまた、STDINとSTDERRをbinmodeし、そのレキシカルスコープで 'open'のデフォルトのエンコーディングレイヤーを設定します(例えば、' open my $ fh、 '<'、 '/ tmp/xxx'私の$ fh、 '<:エンコーディング(UTF-8)'、 '/ tmp/xxx' ')を開きます。 – ikegami

1

use utf8は、ソースコードがUTF-8であることを前提としています。

openプラグマは、標準ファイルハンドルのエンコーディング変更することができます。

use open qw(:std :utf8); 
関連する問題