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

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:

打印功能一直有问题,我知道我遗漏了一些小东西。我到处找,试了试,但似乎找不到解决办法

我试图用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: 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:您的字符代码错误

    • 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
    ⠁
    ⢁
    

    看看那个特定的修复程序,使用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