gpt4 book ai didi

Perl 字符串内部结构

转载 作者:行者123 更新时间:2023-12-04 07:12:52 25 4
gpt4 key购买 nike

perl 字符串如何在内部表示?使用什么编码?如何正确处理不同的编码?

我已经使用 perl 很长时间了,但是它没有包含很多不同编码的字符串处理,当我遇到一个与编码有关的小问题时,我通常会求助于一些萨满操作。

直到此刻,我都将 perl 字符串视为字节序列,它非常适合我的任务。现在我需要对 UTF-8 编码文件进行一些处理,这里开始出现问题。

首先,我像这样将文件读入字符串:

open(my $in, '<', $ARGV[0]) or die "cannot open file $ARGV[0] for reading";
binmode($in, ':utf8');

my $contents;

{
local $/;
$contents = <$in>;
}

close($in);

然后简单地打印它:
print $contents;

我得到两件事:警告 Wide character in print at <scriptname> line <n>和控制台中的垃圾。所以我可以得出结论,perl 字符串有一个“字符”的概念,可以是“宽”也可以不是,但是当打印这些“宽”字符时,这些“宽”字符在控制台中表示为多个字节,而不是单个“字符”。
(我现在想知道为什么我以前使用二进制文件的所有经验都与我期望的那样工作,而没有任何“字符”问题)。

为什么然后我在控制台看到垃圾?如果 perl 以某种已知编码将字符串存储为字符,我认为找出控制台编码并正确打印文本不会有什么大问题。 (我使用 Windows,顺便说一句)。

如果 perl 将字符串存储为可变宽度字符序列(例如使用相同的 UTF-8 编码),为什么要这样做?从我处理字符串的 C 经验来看,是痛苦的。

更新 .

我使用两台计算机进行测试,一台运行 Windows 7 x64,安装了英语语言包,但使用俄语区域设置(所以我将 cp866 作为 OEM 代码页,cp1251 作为 ANSI)和 ActivePerl 5.10.1 x64;另一个使用 Cygwin Perl 5.10.0 运行 Windows XP 32 位俄语本地化版本。

感谢链接,现在我对正在发生的事情以及应该如何做有了更深入的了解。

最佳答案

在读取文件之前设置 utf8 很好,它会自动将字节解码为内部编码。 (这也是 UTF-8 但你不需要知道,也不应该依赖。)

在打印之前,您需要将字符编码回字节。

use Encode;  
utf8::encode($contents);

对于 unicode 以外的其他编码,也有两种参数形式的编码。 (这句话太有共鸣了吧?)

这是一个很好的引用。 (本来会更多,但这是我的第一篇文章。)也请查看 perlunitut,以及关于 Joel on Software 的 unicode 文章。

http://www.ahinea.com/en/tech/perl-unicode-struggle.html

哦,它必须使用多字节字符串,否则它就不是 unicode。

关于Perl 字符串内部结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2964328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com