相关疑难解决方法(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万
查看次数

用于将HTML实体转换为字符的Bash脚本

我正在寻找一种方法来解决这个问题:

hello < world
Run Code Online (Sandbox Code Playgroud)

对此:

hello < world
Run Code Online (Sandbox Code Playgroud)

我可以使用sed,但如何在不使用神秘的正则表达式的情况下实现这一目标?

html bash html-escape-characters

56
推荐指数
7
解决办法
4万
查看次数

如何从Perl将文件保存为UTF-8?

我正在尝试用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 utf-8

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

在Perl中打印到文件与打印到shell

我正在编写一个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)

unicode perl utf-8

6
推荐指数
1
解决办法
161
查看次数

使用csv文件使用utf8名称复制/重命名图像

我正在编写一个脚本来批量重命名和复制基于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)

csv perl utf-8

5
推荐指数
1
解决办法
1045
查看次数

使用Perl Mechanize编写换行符,引号和特殊字符

我正在尝试使用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)

perl encoding mechanize

5
推荐指数
1
解决办法
229
查看次数

如何从Text :: CSV utf8输出?

我有一个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中获取输出文本?

笔记:

  1. 环境:openSUSE 13.2 x86_64,perl 5.20.1
  2. 我不使用Text :: CSV :: …

csv perl encoding utf-8

4
推荐指数
1
解决办法
2403
查看次数

Windows上的Perl:编码问题

我的Perl脚本有问题.在类UNIX系统中,它可以ä正确地将所有Unicode字符打印到控制台.在Windows命令行中,字符被破坏为无意义的字形.有一种简单的方法可以避免这种情况吗?我正在使用use utf8;.

提前致谢.

windows perl encoding activeperl

3
推荐指数
1
解决办法
2984
查看次数

转义多字节字符

使用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)

unicode perl escaping utf-8 unicode-escapes

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