如何在 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 字符