我想知道为什么使用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中太复杂了.
我正在寻找一种方法来解决这个问题:
hello < world
Run Code Online (Sandbox Code Playgroud)
对此:
hello < world
Run Code Online (Sandbox Code Playgroud)
我可以使用sed,但如何在不使用神秘的正则表达式的情况下实现这一目标?
我正在尝试用UTF-8中的Perl创建/保存HTML文件,但到目前为止我没有做任何事情.一个以前的答案在这里SO据说用binmode,所以我试过了.这是我的代码:
open (OUT, ">$sectionfilename");
binmode(OUT, ":utf8");
print OUT $section;
close OUT;
Run Code Online (Sandbox Code Playgroud)
当我在像记事本这样的文本编辑器中打开这些文件时,它们仍然是ANSI编码.我究竟做错了什么?
我正在编写一个Perl程序,将我的本地语言ASCII字符转换为Unicode字符(泰米尔语).
这是我的计划
#!/bin/perl
use strict;
use warnings;
use open ':std';
use open ':encoding(UTF-8)';
use Encode qw( encode decode );
use Data::Dump qw(dump);
use Getopt::Long qw(GetOptions);
Getopt::Long::Configure qw(gnu_getopt);
my $font;
my %map;
GetOptions(
'font|f=s' => \$font,
'help|h' => \&usage,
) or die "Try $0 -h for help";
print "Do you want to map $font? (y/n)";
chomp( my $answer = lc <STDIN> );
$font = lc( $font );
$font =~ s/ /_/;
$font =~ s/(.*?)\.ttf/$1/;
if ( $answer eq "y" ) { …Run Code Online (Sandbox Code Playgroud) 我正在编写一个脚本来批量重命名和复制基于csv文件的图像.csv由第1列组成:旧名称和第2列:新名称.我想使用csv文件作为perl脚本的输入,以便它检查旧名称并使用新名称将副本复制到新文件夹中.(我认为)我与图像有关的问题.它们包含像ß等utf8字符.当我运行脚本时,它打印出来:Barfu├ƒg├ñsschen它应该是Barfußgässchen并且出现以下错误:
Unsuccessful stat on filename containing newline at C:/Perl64/lib/File/Copy.pm line 148, <$INFILE> line 1.
Copy failed: No such file or directory at X:\Script directory\correction.pl line 26, <$INFILE> line 1.
Run Code Online (Sandbox Code Playgroud)
我知道它与Binmode utf8有关,但即使我尝试一个简单的脚本(在这里看到它:如何从Perl输出UTF-8?):
use strict;
use utf8;
my $str = 'Çirçös';
binmode(STDOUT, ":utf8");
print "$str\n";
Run Code Online (Sandbox Code Playgroud)
它打印出来:Ãirþ÷s
这是我的整个剧本,有人可以向我解释我哪里出错了吗?(它不是最干净的代码,因为我正在测试的东西).
use strict;
use warnings;
use File::Copy;
use utf8;
my $inputfile = shift || die "give input!\n";
#my $outputfile = shift || die "Give output!\n";
open my $INFILE, '<', $inputfile or die "In use …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Mechanize开发PERL程序,这将允许我从我的网站上重新发布其他网站上的内容.但我在编码方面遇到了一些问题:
我的网站使用UTF-8编码,另一个网站使用ISO-8859-15编码.以下是我网站上的数据样本以及其他网站上公布的结果:
10 M€d'encours/10 M?d?encours
这是我的PERL计划:
#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use WWW::Mechanize;
use HTML::TreeBuilder;
use HTML::TreeBuilder::XPath;
my $mech = WWW::Mechanize->new(
stack_depth => 0,
timeout => 10,
);
$mech->get("RecoveredDataFromMyWebsiteUrl");
my $tree = HTML::TreeBuilder::XPath->new_from_content($mech->content);
my $data = $tree->findvalue('/html/body//div[@id="content"]');
$data = Encode::encode("iso-8859-15",$data);
$mech->get("OtherWebsiteFormularUrl");
$mech->form_name("formular")->accept_charset('iso-8859-15');# Form Post Emploi
$mech->set_fields(
content => $data
);
$mech->submit;
open FIC,">output.html"
or die "E/S : $!\n";
my $out = select(FIC5);
print $mech->content;
Run Code Online (Sandbox Code Playgroud) 我有一个CSV文件,比如win.csv,其文本在windows-1252中编码.首先我使用iconv在utf8中制作它.
$iconv -o test.csv -f windows-1252 -t utf-8 win.csv
Run Code Online (Sandbox Code Playgroud)
然后我用以下Perl脚本(utfcsv.pl)读取转换后的CSV文件.
#!/usr/bin/perl
use utf8;
use Text::CSV;
use Encode::Detect::Detector;
my $csv = Text::CSV->new({ binary => 1, sep_char => ';',});
open my $fh, "<encoding(utf8)", "test.csv";
while (my $row = $csv->getline($fh)) {
my $line = join " ", @$row;
my $enc = Encode::Detect::Detector::detect($line);
print "($enc) $line\n";
}
$csv->eof || $csv->error_diag();
close $fh;
$csv->eol("\r\n");
exit;
Run Code Online (Sandbox Code Playgroud)
然后输出如下.
(UFT-8) .........
() .....
Run Code Online (Sandbox Code Playgroud)
即,所有行的编码都被检测为UTF-8(或ASCII).但实际输出似乎不是UTF-8.实际上,如果我将输出保存在文件中
$./utfcsv.pl > output.txt
Run Code Online (Sandbox Code Playgroud)
然后将output.txt的编码检测为windows-1252.
问题:如何在UFT-8中获取输出文本?
笔记:
我的Perl脚本有问题.在类UNIX系统中,它可以ä正确地将所有Unicode字符打印到控制台.在Windows命令行中,字符被破坏为无意义的字形.有一种简单的方法可以避免这种情况吗?我正在使用use utf8;.
提前致谢.
使用Python - 我可以获取一个字符串并使用UTF-8转义的多字节字符返回它:
$ python3 -c 'print("hello ? world".encode("utf-8"))'
b'hello \xe2\x98\xba world'
Run Code Online (Sandbox Code Playgroud)
或unicode逃脱:
$ python3 -c 'print("hello ? world".encode("unicode-escape"))'
b'hello \\u263a world'
Run Code Online (Sandbox Code Playgroud)
Perl可以这样做吗?我试过"quotemeta",但它似乎不是正确的工具:
$ perl -e 'print quotemeta("hello ? world\n");'
hello\ \?\?\?\ world\
Run Code Online (Sandbox Code Playgroud)