2017-06-27 3 views
0

印刷機能に問題がありました。私はどこにでも見ていて、物事を試してきましたが、解決策を見つけることができません。perlはユニコード文字の代わりに3つの間違った文字を表示します

私はperlで点字を印刷しようとしています。私はテーブルから2881という値を得て、それをhexaに変換しました。 16進文字を印刷しようとすると、perlは3文字を代わりに表示します。

コード:

#!/usr/local/bin/perl 
    use utf8; 
    print "\x{AF1}"; 

出力:

C:\Users\ElizabethTosh\Desktop>perl testff.pl 
Wide character in print at testff.pl line 3. 
૱ 
+0

https://stackoverflow.com/questions/627661/how-can-i-output-を見てくださいutf-8-per-perl – mttrb

+0

binmode(STDOUT、 ":utf8")を使用したその特定の修正。出力をフォーマットし、警告を抑制しますが、1の代わりに3を出力します。私のバージョンのperlかもしれないと思いますか?私はこの問題を他の場所で見つけることはできないようです。 – Liz

+0

あなたのコンソールはUTF-8: 'chcp 65001'を期待する必要があります。 –

答えて

0

あなたはUTF-8の文字を保存し、それが代わりに1の3つの奇妙な文字として表示されます場合は、文字がであることを意味し範囲はU + 0800からU + FFFFまでで、UTF-8の代わりにシングルバイトのエンコーディングでデコードします。

端末のエンコーディングをUTF-8に変更してください。

perl testff.pl >file 

と文字が正しく表示されているかどうかを確認するために、UTF-8をサポートしているテキストエディタでファイルを開きます。これを行うことができない場合は、出力をファイルにリダイレクトします。


あなたは文字U + 2881()、およびないU + 0AF1を印刷したいです。 2881はすでに16進数です。

use open ':std', ':encoding(UTF-8)'; 

代わりの唯一のプログラムテキストとしての解釈を可能にuse utf8;、:


はUTF-8にあなたのPerlプログラムの入力および出力を設定し、Wide character in print警告を取り除くために、 UTF-8。


概要

ソースファイル(testff.pl):

#!/usr/local/bin/perl 
use strict; 
use warnings; 
use open ':std', ':encoding(UTF-8)'; 
print "\x{2881}"; 

ラン:

> perl testff.pl 
⢁ 
+0

hmmmは私のために同じ出力を生成しません...私のバージョンのperlまたはosに問題がなければなりません。応答に感謝します。 – Liz

+0

あなたの出力は今何ですか? – weibeld

+0

前述のように、端末の文字エンコーディングをチェックし、それをUTF-8に設定します。そうすればうまくいくはずです。 – weibeld

3

問題#1:あなたがのための出力をエンコードするためにPerlを指示する必要がありますあなたの端末。

プログラムに以下を追加します。

use Win32 qw(); 
use open ':std', ':encoding(cp'.Win32::GetConsoleOutputCP().')'; 

use utf8;は、単にそのソースファイルではなく、ASCIIのUTF-8を使用してエンコードされて指定します。


問題#2:あなたの端末はおそらくその文字を処理できません。

米国英語のコンソールのコンソールは、おそらくcp437と思われます。文字セットには点字は含まれていません。

chcp 65001を使用してコードページ65001(UTF-8)に切り替えることができます。また、コンソールのフォントを点字を含むフォントに切り替える必要があるかもしれません。 (それはバックスラッシュに奇妙なことを行いますが、MSゴシックは、私のために働いた。)


問題#3:あなたは間違った文字コードを持っています。

  • U+0AF1 GUJARATI RUPEE SIGN(&#x0AF1):"\x{AF1}"又は"\N{U+0AF1}"又はchr(2801)
  • U+0B41 ORIYA VOWEL SIGN U(&#x0B41):"\x{B41}"又は"\N{U+0B41}"又はchr(2881)
  • U+2801 BRAILLE PATTERN DOTS-1(&#をx2801;):"\x{2801}"又は"\N{U+2801}"又はchr(10241)
  • U+2881 BRAILLE PATTERN DOTS-18(⢁):"\x{2881}"または"\N{U+2881}"または
  • すべて一緒に

use strict; 
use warnings; 
use feature qw(say); 

use Win32 qw(); 
use open ':std', ':encoding(cp'.Win32::GetConsoleOutputCP().')'; 

say(chr($_)) for 0x2801, 0x2881; 

は出力:

>chcp 65001 
Active code page: 65001 

>perl a.pl 
⠁ 
⢁ 
+0

残念ながら、上記のいずれも問題なく動作していますが、解決策は私には意味がありますが、ハードウェアに問題があると思います。 – Liz

+1

問題が十分に解明されていません。何を手に入れましたか?どのようなOSですか? 'perl -v'の" This is "行は何ですか?どのフォントをコンソールに切り替えて使用しましたか? – ikegami

+0

私はWindows 10を使用しており、Perlは&Win :: GetConsoleOutputCPサブルーチンが定義されていないと言っています。私はGetConsoleOutputCPが何であるか、カーネルがコードページを返す関数、そしてperlのopenキーワードがファイルを開くことを学びました。私が読んだことは、ファイルを開くためのものであることを示唆して以来、どのように進むべきかわかりません。 – Liz

関連する問題