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

Posted

技术标签:

【中文标题】如何在 Perl 中显示扩展 ASCII 代码字符?【英文标题】:How can I display Extended ASCII Codes characters in Perl? 【发布时间】:2011-04-14 18:16:28 【问题描述】:

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

【问题讨论】:

192 实际上不是 ASCII。 ASCII 集以 128(或 127,具体取决于您包含的内容)结束。 这个问题的完美标题是什么? 如果您想打印值为 192 的字符,那么您需要告诉我们您使用的是哪种字符编码。它不是 ASCII,因为 ASCII 只定义了 128 个字符?您是否使用其中一种扩展字符集?也许是 cp1252 或 ISO-8859? 没有“扩展 ASCII”之类的东西,你所拥有的就是代码页 437:en.wikipedia.org/wiki/Code_page_437 【参考方案1】:

你想要的是能够打印unicode,答案在perldoc perluniintro

您可以使用\xnnnn,其中 n 是十六进制标识符,或者您可以使用名称:\N...

perl -E 'say "\x2514"; use charnames; say "\NBOX DRAWINGS LIGHT UP AND RIGHT"'

【讨论】:

我已经编辑了与问题相关的代码示例。如果您不同意,您可以轻松撤消此操作。【参考方案2】:

要准确使用这些代码,您的终端必须支持包含帧的Code Page 437。或者,您可以使用带有较少装箱字符的派生CP850。 此类拳击字符也以Unicode Block Elements 的形式存在。您在 perl 中需要的字符被标记为\NU+2514。更多详情perlunicode

【讨论】:

"\x2514" 也可以。此语法在 perlop 中进行了解释。【参考方案3】:

这看起来像代码页 437 编码。 Perl 可能只是输出你给它的字节。而且您的终端可能需要 UTF8。

所以你需要把它解码成 Unicode,然后用 UTF-8 重新编码。

编辑:正确编码。

【讨论】:

或者,更改您的终端设置。 :) 不,是 IBM437。见IANA、RFC 1345、en.Wikipedia。【参考方案4】:

像往常一样,Jon Skeet 指出:192 代码在“extended ASCII”范围内。我建议你关注@Douglas Leeder's advice,但我不确定 www.LookupTables.com 给你的是哪种编码; ISO-8859-1 认为 192 映射到“À”,Mac OS Roman 认为它的“¿”。

【讨论】:

“扩展 ASCII”是一个编码系列。问题中的一个是IBM437。见IANA、RFC 1345、en.Wikipedia。【参考方案5】:

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

用户说他们想使用 latin-1 扩展字符集字符 - 所以让我们试试这个块中的一个例子!所以,如果他们想要Æ 字符,他们会跑……

print "\x00C6";

输出:

Full Testable, Online Demo

Perl 中的 TDLR 字符编码模式

那么,等等,刚刚发生了什么?您会注意到调用 UTF-8 的其他方式,例如char(...)\NU+...,甚至unpack(...) 也有同样的问题。没错——问题不在于这些函数中的任何一个,而在于底层字符抽象层。在这种情况下,您需要在代码的早期指出这一层。

use open qw( :std :encoding(UTF-8) );
print "\x00C6";

输出:Æ

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

Full Testable, Online Demo

为什么会这样?

PerlDoc 中有一条关于chr() function....的注释

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

出于这个原因,这个特殊的块需要有那个特殊的use open来表示std编码。

【讨论】:

以上是关于如何在 Perl 中显示扩展 ASCII 代码字符?的主要内容,如果未能解决你的问题,请参考以下文章

Perl Cryptology:使用打包和解包功能加密/解密 ASCII 字符

字符扩展ascii显示PHP

在ASCII码字符编码中,啥字符无法显示或打印出来

c语言怎么求字符的ascii码

Console.Write() - 显示扩展的 ascii 字符?

如何在 C 中使用扩展 ASCII 表的符号?