perl打印3个错误字符,而不是unicode字符
打印功能一直有问题,我知道我遗漏了一些小东西。我到处找,试了试,但似乎找不到解决办法 我试图用perl打印盲文字符,我从一个表中得到了2881的值,并将其转换为hexa。当我尝试打印十六进制字符时,perl会打印3个字符 代码: 输出:perl打印3个错误字符,而不是unicode字符,perl,unicode,Perl,Unicode,打印功能一直有问题,我知道我遗漏了一些小东西。我到处找,试了试,但似乎找不到解决办法 我试图用perl打印盲文字符,我从一个表中得到了2881的值,并将其转换为hexa。当我尝试打印十六进制字符时,perl会打印3个字符 代码: 输出: C:\Users\ElizabethTosh\Desktop>perl testff.pl Wide character in print at testff.pl line 3. α½▒ >chcp 65001 Active code page:
C:\Users\ElizabethTosh\Desktop>perl testff.pl
Wide character in print at testff.pl line 3.
૱
>chcp 65001
Active code page: 65001
>perl a.pl
⠁
⢁
如果使用UTF-8保存一个字符,并且该字符显示为3个奇怪字符而不是1个,则表示该字符在U+0800到U+FFFF的范围内,并且使用一些单字节编码而不是UTF-8对其进行解码 因此,将终端的编码更改为UTF-8。如果无法执行此操作,请将输出重定向到文件:
perl testff.pl >file
并使用支持UTF-8的文本编辑器打开该文件,以查看字符是否正确显示
您想打印字符U+2881(
⢁代码>),而不是U+0AF1<代码>2881
已为十六进制
要消除打印中的宽字符警告,请将Perl程序的输入和输出设置为UTF-8:
use open ':std', ':encoding(UTF-8)';
使用utf8代替代码>,仅允许将程序文本解释为UTF-8
摘要
源文件(testff.pl
):
运行:
如果使用UTF-8保存一个字符,并且该字符显示为3个奇怪字符而不是1个,则表示该字符在U+0800到U+FFFF的范围内,并且使用一些单字节编码而不是UTF-8对其进行解码
因此,将终端的编码更改为UTF-8。如果无法执行此操作,请将输出重定向到文件:
perl testff.pl >file
并使用支持UTF-8的文本编辑器打开该文件,以查看字符是否正确显示
您想打印字符U+2881(⢁代码>),而不是U+0AF1<代码>2881
已为十六进制
要消除打印中的宽字符
警告,请将Perl程序的输入和输出设置为UTF-8:
use open ':std', ':encoding(UTF-8)';
使用utf8代替代码>,仅允许将程序文本解释为UTF-8
摘要
源文件(testff.pl
):
运行:
问题1:您需要告诉Perl对终端的输出进行编码
将以下内容添加到您的程序中
use Win32 qw( );
use open ':std', ':encoding(cp'.Win32::GetConsoleOutputCP().')';
使用utf8
仅指定源文件使用UTF-8而不是ASCII编码的格式
问题2:您的终端可能无法处理该字符
美英机器的控制台很可能是我们所期待的。它的字符集不包括任何盲文字符
您可以尝试使用chcp 65001
切换到代码页65001(UTF-8)。您可能还需要将控制台的字体切换为包含盲文字符的字体。(哥特女士为我工作,尽管它会对反斜杠做一些奇怪的事情。)
问题3:您的字符代码错误
U+0AF1古吉拉特邦卢比符号
(૱): <代码>“\x{AF1}”
或“\N{U+0AF1}”
或chr(2801)
U+0B41 ORIYA元音符号U
(ୁ): <代码>“\x{B41}”或“\N{U+0B41}”
或chr(2881)
U+2801盲文图案DOTS-1
(⠁): <代码>“\x{2801}”或“\N{U+2801}”
或chr(10241)
U+2881盲文图案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;
输出:
C:\Users\ElizabethTosh\Desktop>perl testff.pl
Wide character in print at testff.pl line 3.
૱
>chcp 65001
Active code page: 65001
>perl a.pl
⠁
⢁
问题1:您需要告诉Perl对终端的输出进行编码
将以下内容添加到您的程序中
use Win32 qw( );
use open ':std', ':encoding(cp'.Win32::GetConsoleOutputCP().')';
使用utf8;
仅指定源文件使用UTF-8而不是ASCII编码的格式
问题2:您的终端可能无法处理该字符 美英机器的控制台很可能是预期的。它的字符集不包括任何盲文字符 您可以尝试使用
chcp 65001
切换到代码页65001(UTF-8)。您可能还需要将控制台的字体切换到包含盲文字符的字体。(哥特女士为我工作,尽管它对反斜杠有奇怪的作用。)
问题3:您的字符代码错误
(૱): <代码>“\x{AF1}”或U+0AF1古吉拉特邦卢比符号
或“\N{U+0AF1}”
chr(2801)
(ୁ): <代码>“\x{B41}”或U+0B41 ORIYA元音符号U
或“\N{U+0B41}”
chr(2881)
(⠁): <代码>“\x{2801}”或U+2801盲文图案DOTS-1
或“\N{U+2801}”
chr(10241)
(⢁): <代码>“\x{2881}”或U+2881盲文图案DOTS-18
或“\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;
输出:
C:\Users\ElizabethTosh\Desktop>perl testff.pl
Wide character in print at testff.pl line 3.
૱
>chcp 65001
Active code page: 65001
>perl a.pl
⠁
⢁
看看那个特定的修复程序,使用binmode(STDOUT,“:utf8”);格式化输出,抑制警告,但仍然打印出3而不是1。你认为它可能是我的perl版本吗?我似乎在别处找不到这个问题。你的控制台需要UTF-8:
chcp 65001
。看看那个特定的修复程序,使用binmode(标准符号“:utf8”);若要格式化输出,请取消警告,但仍然打印出3而不是1。您认为这可能是我的perl版本吗?我似乎在其他地方找不到此问题。您的控制台需要UTF-8:chcp 65001
。hmmm不会为我生成相同的输出…我的perl版本或操作系统一定有问题,谢谢您的回复ponse.那么您现在的输出是什么呢?如前所述,检查您终端的字符编码,并将其设置为UTF-8。然后它应该可以工作。我建议使用open':std',':encoding(UTF-8);
而不是binmode(STDOUT,:utf8”);
。它还可以调整STDIN和STDERR,并设置默认值为f