打印功能出现问题,我知道我错过了一些小东西。我一直在寻找各种各样的东西,但似乎无法找到解决方案。
我正在尝试在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 :(得分: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
⢁