perl打印3个错误字符而不是unicode字符

时间:2017-06-27 03:31:35

标签: perl 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.
૱

2 个答案:

答案 0 :(得分: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 Gothic为我工作,虽然它对反斜杠做了奇怪的事情。)

问题#3:您的字符代码错误。

  • U+0AF1 GUJARATI RUPEE SIGN(૱):"\x{AF1}""\N{U+0AF1}"chr(2801)
  • U+0B41 ORIYA VOWEL SIGN U(ୁ):"\x{B41}""\N{U+0B41}"chr(2881)
  • U+2801 BRAILLE PATTERN DOTS-1(⠁):"\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
⠁
⢁

答案 1 :(得分: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
⢁