相关疑难解决方法(0)

为什么现代Perl默认会避免使用UTF-8?

我想知道为什么使用Perl构建的大多数现代解决方案默认情况下不启用UTF-8.

我知道核心Perl脚本存在许多遗留问题,可能会破坏它们.但是,从我的角度来看,在21 日的世纪,新的大项目(或具有大的方面讲项目)应该从头开始他们的软件UTF-8的证明.我仍然没有看到它发生.例如,Moose启用严格和警告,但不启用Unicode.Modern :: Perl也减少了样板,但没有UTF-8处理.

为什么?是否有一些理由在2011年的现代Perl项目中避免使用UTF-8?


评论@tchrist太长了,所以我在这里添加它.

似乎我没有说清楚.让我尝试添加一些东西.

tchrist和我看到情况非常相似,但我们的结论完全是相反的.我同意,Unicode的情况很复杂,但这就是为什么我们(Perl用户和编码人员)需要一些层(或编译指示),这使得UTF-8处理变得像现在一样容易.

tchrist指出要涵盖的许多方面,我会阅读并思考它们几天甚至几周.不过,这不是我的观点.tchrist试图证明没有一种方法"启用UTF-8".我没有太多的知识可以与之争辩.所以,我坚持住实例.

我和Rakudo一起玩,UTF-8就在我需要的地方.我没有任何问题,它只是奏效了.也许在某些地方存在一些限制,但一开始,我测试的所有工作都按照我的预期进行.

这不应该是现代Perl 5的目标吗?我更强调一点:我不是建议将UTF-8作为核心Perl的默认字符集,我建议可以为那些开发新项目的人快速触发它.

另一个例子,但更负面的语气.框架应该使开发更容易.几年前,我尝试过Web框架,但只是把它们扔掉了,因为"启用UTF-8"是如此模糊.我没有找到如何以及在何处挂钩Unicode支持.这是非常耗时的,我发现它更容易走老路.现在我看到这里有一个赏金来处理与梅森 2 相同的问题:如何让Mason2 UTF-8干净?.因此,它是一个非常新的框架,但使用UTF-8需要深入了解其内部.这就像一个大红色标志:停止,不要使用我!

我真的很喜欢Perl.但处理Unicode是痛苦的.我仍然发现自己在墙上奔跑.某种方式tchrist是正确的,并回答我的问题:新项目不吸引UTF-8,因为它在Perl 5中太复杂了.

unicode perl utf-8

555
推荐指数
6
解决办法
10万
查看次数

autodie-pragma对编码有影响吗?

为什么我得到"autodie"不同的输出?

#!/usr/bin/env perl
use warnings;
use 5.012;
use utf8;
use open ':encoding(utf-8)';
use open ':std';

open my $fh, '>', 'test.txt' or die $!;
say $fh 'käse';
close $fh;

open my $fh1, '<', 'test.txt' or die $!;
while ( my $row = readline( $fh1 ) ) {
    print $row;
}
close $fh1;

use autodie;

open my $fh2, '<', 'test.txt';
while ( my $row = readline( $fh2 ) ) {
    print $row;
}
close $fh2;

# Output:
# käse
# käse
Run Code Online (Sandbox Code Playgroud)

perl encoding autodie

16
推荐指数
1
解决办法
291
查看次数

如何测试/分类CPAN模块的utf8正确性

这里是一个很好的问题及精彩tchrist的答案 7 + 24条+ 52建议和意见,如何使Perl程序UTF8安全.

但这里是19k CPAN模块.什么是可以做的区分"好"和"坏"?(从utf8的角度来看)

例如:File::Slurp如果您将阅读该文件

#use strict encoding warnings utf8 autodie... etc....
my $str = read_file($file, binmode => ':utf8');
Run Code Online (Sandbox Code Playgroud)

您将根据命令行开关获得不同的结果,并且perl -CSDA不起作用.伤心.(是的,我知道比Encode :: decode("utf8",read_file($ file,binmode =>':raw'));会有所帮助,但无论如何都是SAD.

我的问题:

  • 在这里有任何首选方式,如何测试/分类哪些CPAN模块是安全/准备/正确的?
  • 在这里有一些测试::已经为utf8测试做了些什么?
  • 在这里是类似于Perl ::批判性的utf8 - 什么会检查模块源可能的utf8错误?(因为手动检查7 + 24 + 52件事物的来源我无法归类为"简单的编程方式")
  • 或任何其他方式?:)

据我所知,CPAN模块很多都不需要了解utf8.但这里有zilion其他应该是什么.

拜托,不要误解我.我喜欢Perl语言.我知道perl具有非常强大的utf8功能.(特别是5.14).以上并不意味着perl批判 - 但我(也可能是其他一些人)需要知道什么是CPAN模块,以及如何对它们进行分类......)

在使用多个CPAN模块进行开发时,最初一切顺利,但在最终测试中,您发现某些模块不支持utf8,因此您的部分工作无用 - 这实际上可能会导致一点幻灭.:(

编辑:

据我所知,unicode周围的所有复杂事物都有两个根源:

  1. unicode本身 - 作为tchrist极好地分析了一些问题点
  2. perl - 简单不能破坏所有工作模块,实时服务器等 - 所以需要保持向后兼容性.

我唯一的希望:perl6.是一种全新的,不同的语言.不需要保持任何向后兼容性.所以我希望,在perl6中默认一些事情是perl5中不可能做的事情,所有utf8事情都会更加直观.

但是,回到模块:@daxim告诉:"作者甚至不会透露他们的模块是否是污点安全的,这个功能存在了几十年!" - 这是一场灾难.也许(很可能,老实说也不知道怎么做),但也许我们到了那个时候,需要对CPAN提交提出更多更严格的限制.

在一方面,我对CPAN作者的志愿者作品非常满意.另一方面,发布源代码不仅仅是一个"正确"的言论自由 …

perl cpan utf-8

13
推荐指数
1
解决办法
305
查看次数

open pragma与不同的utf8有何不同?

这三个版本的行为都不一样吗?

use open qw( :encoding(UTF-8) :std );  
use open qw( :encoding(UTF8) :std );  
use open qw( :utf8 :std );  
Run Code Online (Sandbox Code Playgroud)

perl utf-8

2
推荐指数
1
解决办法
1169
查看次数

如何使用open pragma的utf8编码

我utf8::encode在使用pragma时遇到问题use open qw(:std :utf8);

例

#!/usr/bin/env perl

use v5.16;
use utf8;
use open qw(:std :utf8);

use Data::Dumper;

my $word = "+????";
say Dumper($word);
say utf8::is_utf8($word) ? 1 : 0;

utf8::encode($word);
say Dumper($word);
say utf8::is_utf8($word) ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

产量

$VAR1 = "+\x{431}\x{430}\x{43d}\x{43a}";
1
$VAR1 = '+банк';
0
Run Code Online (Sandbox Code Playgroud)

当我删除这个pragma use open qw(:std :utf8);,一切都很好.

$VAR1 = "+\x{431}\x{430}\x{43d}\x{43a}";
1
$VAR1 = '+????';
0
Run Code Online (Sandbox Code Playgroud)

先谢谢你!

perl utf-8 character-encoding

2
推荐指数
1
解决办法
265
查看次数

标签 统计

perl ×5

utf-8 ×4

autodie ×1

character-encoding ×1

cpan ×1

encoding ×1

unicode ×1