2017-06-27 158 views
0

一直有打印功能的麻煩,我知道我錯過了一些小東西。我一直在尋找和嘗試的東西,但似乎無法找到解決方案。perl打印3個錯誤的字符,而不是unicode字符

我試圖在perl中打印盲文字符,我從表中獲取了2881的值並將其轉換爲hexa。當我嘗試打印十六進制字符時,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-from-perl – mttrb

+0

使用binmode(STDOUT,「:utf8」);格式化輸出,壓制警告,但仍然打印出3而不是1.你認爲它可能是我的Perl版本?我似乎無法在別處找到這個問題。 – Liz

+0

您的控制檯需要使用UTF-8:'chcp 65001'。 –

回答

0

如果您使用UTF-8字符,它顯示爲3個奇怪的字符,而不是1,這意味着該字符是範圍U + 0800到U + FFFF,並且您使用一些單字節編碼而不是UTF-8對其進行解碼。

因此,請將終端的編碼更改爲UTF-8。如果你不能做到這一點,將輸出重定向到一個文件:

perl testff.pl >file 

,並打開與支持UTF-8的文本編輯器中的文件,以查看是否顯示正確的字符。


要打印的字符U + 2881(),而不是U + 0AF1。 2881已經是十六進制。


爲了擺脫Wide character in print警告,你的Perl程序的輸入和輸出設置爲UTF-8:

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

代替use utf8;,只允許程序文本的解讀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

嗯,不會爲我輸出相同的輸出...我的版本的Perl或操作系統必須有問題,謝謝你的迴應。 – Liz

+0

那麼你現在的輸出是什麼? – weibeld

+0

如上所述,檢查您的終端的字符編碼,並將其設置爲UTF-8。那麼它應該工作。 – weibeld

3

問題1:你需要告訴Perl來爲輸出編碼你的終端。

將以下內容添加到您的程序中。

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

use utf8;僅僅指定了該源文件是使用UTF-8代替ASCII編碼。


問題#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}"chr(10369)

總之,

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行?你使用什麼字體切換控制檯? – ikegami

+0

我使用的是Windows 10,而perl則說&Win :: GetConsoleOutputCP子程序是未定義的;我瞭解了GetConsoleOutputCP是什麼,內核使用的函數返回代碼頁,並且perl中的open關鍵字打開文件。我不確定如何繼續,因爲我讀過的內容表明打開文件是開放的。 – Liz