如何在Perl中显示扩展ASCII码字符?

7

alt text

如何在Perl中显示192个字符的符号( └ )


9
192实际上不是ASCII码。 ASCII码集在128(或127,具体取决于包含的内容)结束。 - Jon Skeet
这个问题的完美标题是什么? - Tree
3
如果您想打印值为192的字符,则需要告诉我们使用的字符编码。这不是ASCII,因为ASCII只定义了128个字符。您是否使用扩展字符集之一?也许是cp1252或ISO-8859? - Dave Cross
1
并不存在所谓的 "扩展 ASCII",你所看到的应该是称为 Code Page 437 的东西:http://en.wikipedia.org/wiki/Code_page_437 - Christoffer Hammarström
5个回答

11
你想要的是能够打印Unicode字符,答案在perldoc perluniintro中。你可以使用\x{nnnn},其中n是十六进制标识符,或者使用\N{...}和名称。
perl -E 'say "\x{2514}"; use charnames; say "\N{BOX DRAWINGS LIGHT UP AND RIGHT}"'

我已经编辑过代码示例,使其与问题相关。如果你不同意,你可以轻松地撤销这个操作。 - daxim

8
要使用这些代码,您的终端必须支持包含框架的Code Page 437。或者,您可以使用派生自CP850的字符集,其中包含较少的盒子字符。 这些盒子字符也存在于Unicode块元素中。您在perl中所需的字符被标记为\N{U+2514}。更多详细信息请参见perlunicode

"\x{2514}" 也可以实现相同的效果。这种语法在 perlop 中有详细解释。 - daxim

5

看起来是代码页 437 编码。Perl 可能只是输出您提供的字节。而您的终端可能期望 UTF8。

因此,您需要将其解码为 Unicode,然后重新编码为 UTF-8。

编辑:正确的编码。


或者,更改您的终端设置。 :) - brian d foy
4
不,它是IBM437字符集。请参见IANARFC 1345en.Wikipedia - daxim

3

像往常一样,Jon Skeet把问题点破了:代码192在“扩展ASCII”范围内。我建议你遵循@Douglas Leeder的建议,但我不确定www.LookupTables.com提供的是哪种编码;ISO-8859-1认为192映射为“À”,而Mac OS Roman则为“¿”。


3
“Extended ASCII”是一组编码集合,问题中提到的是IBM437。请参考IANARFC 1345en.Wikipedia - daxim

0

是否有适用于所有字符的解决方案?

用户表示他们想使用Latin-1扩展字符集中的字符,因此让我们从这个块尝试一个示例!所以,如果他们想要Æ字符,他们会运行...

print "\x{00C6}";

输出:

完整可测试的在线演示

Perl中的字符编码模式

等等,刚才发生了什么?您会注意到调用UTF-8的其他方式, 如char(...)\N{U+...} 和甚至unpack(...)也有相同的问题。没错 - 问题不在于任何这些函数,而是在底层的字符抽象层中。在这种情况下,您需要尽早指示此层。

use open qw( :std :encoding(UTF-8) );
print "\x{00C6}";

输出:Æ

现在我可以正确拼写“Ælf”了!

完整的可测试在线演示

为什么会发生这种情况?

在PerlDoc中有一个注释,涉及到chr()函数....

请注意,默认情况下,128到255(含)之间的字符由于向后兼容性原因,在内部不会被编码为UTF-8。

因此,这个特殊块需要使用特殊的use open来指示标准编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接