我正在尝试找到一个在perl webapp中大写名称的解决方案(使用perl v5.10.1).我原本以为使用Lingua :: EN :: NameCase,但我看到了重音字符的一些问题.
我需要能够处理来自各种欧洲语言(爱尔兰语,法语,德语)的重音字符.
我在网上看到一些迹象表明Lingua :: EN :: NameCase应该适用于我的用例.例如,perlmonks上的这个页面:http://www.perlmonks.org/?node_id = 889135
这是我基于以上链接的测试代码:
#!/usr/bin/perl
use strict;
use warnings;
use Lingua::EN::NameCase;
use locale;
use POSIX qw(locale_h);
my $locale = 'en_FR.utf8';
setlocale( LC_CTYPE, $locale );
binmode DATA, ':encoding(UTF-8)';
binmode STDOUT, ':encoding(UTF-8)';
while (my $original_name = <DATA>) {
chomp $original_name;
my $normalized_name = nc($original_name);
printf "%30s L::EN::NC %30s UCFIRST %30s\n", $original_name, $normalized_name, xlc($original_name);
}
sub xlc {
my $str = shift;
$_ = lc( $str );
return join …Run Code Online (Sandbox Code Playgroud) 我试图用单引号或双引号替换各种字符.
这是我的测试文件:
# Replace all with double quotes
? fullwidth
“ left
” right
„ low
" normal
# Replace all with single quotes
' normal
‘ left
’ right
‚ low
? reverse
` backtick
Run Code Online (Sandbox Code Playgroud)
我正试图这样做......
perl -Mutf8 -pi -e "s/[\x{2018}\x{201A}\x{201B}\x{FF07}\x{2019}\x{60}]/'/ug" test.txt
perl -Mutf8 -pi -e 's/[\x{FF02}\x{201C}\x{201D}\x{201E}]/"/ug' text.txt
Run Code Online (Sandbox Code Playgroud)
但只有反引号字符才能被正确替换.我认为它与其他代码点太大有关,但我找不到任何关于此的文档.
在这里,我有一个单行代码转储Unicode代码点,以验证它们是否与我的正则表达式匹配.
$ awk -F\ '{print $1}' test.txt | \
perl -C7 -ne 'for(split(//)){print sprintf("U+%04X", ord)." ".$_."\n"}'
U+FF02 ?
U+201C “
U+201D ”
U+201E „
U+0022 "
U+0027 ' …Run Code Online (Sandbox Code Playgroud) 考虑以下代码。这样我就得到了一个文件的“syswrite 中的宽字符”,并在浏览器中得到了垃圾:
use Mojolicious::Lite;
use Mojo::UserAgent;
use Mojo::File;
get '/' => sub {
my $c = shift;
my $ua = Mojo::UserAgent->new;
$res = $ua->get('https://...')->result;
Mojo::File->new('resp')->spurt($res->dom->at('.some-selector')->text);
$c->render(text => $res->body);
}
app->start;
Run Code Online (Sandbox Code Playgroud)
但它是这样工作的:
use Encode qw/encode_utf8 decode_utf8/;
Mojo::File->new('resp')->spurt(encode_utf8($res->dom->at('.some-selector')->text));
Mojo::File->new('resp')->spurt($res->body);
$c->render(text => decode_utf8($res->body));
Run Code Online (Sandbox Code Playgroud)
你能解释一下这里发生了什么吗?为什么这两个语句在没有Encode模块的情况下不起作用?为什么第二个有效?有没有更好的处理方法?我已经浏览了perluniintro和perlunicode,但这是我所能得到的。
我在德语 Windows 7 下运行最新的 perl,我想在我的 perl 程序中的任何地方使用 utf8(对于脚本、文件内容、文件名、邮件文本等)。
一切正常,但在尝试处理文件名中包含特殊字符的文件时,我遇到了问题。即使system打电话也不能很好地工作。utf8 那么(如何)我可以告诉 perl在任何地方使用?
我尝试了一段时间encode,decode但很不清楚为什么它能起作用......而且我需要encode('cp850', TEXT)在命令提示符窗口中正确显示。
例子:
当我需要复制文件时,它仅在我使用时有效File::copy(encode("iso-8859-1", $filename), ...),并且当我想使用 pdf 文件内容时,成功的命令是system(encode('cp850', sprintf('pdftk.exe %s...', decode('utf8', $file))));
为什么会这样(特别是系统调用中的解码)并且有更简单的方法吗?也许有什么use open ':encoding...',但到目前为止我还没有运气。
我正在尝试传入一个使用 UNICODE 字符的字符串:"right single quotation mark" Decimal: 8217 Hex: \\x{2019}
Perl 未正确接收字符。让我向您展示详细信息:
\nPerl 脚本如下(我们称之为test.pl):
use warnings;\nuse strict;\nuse v5.32;\nuse utf8; # Some UTF-8 chars are present in the code\'s comments\n\n# Get the first argument\nmy $arg=shift @ARGV or die \'This script requires one argument\';\n\n# Get some env vars with sensible defaults if absent\nmy $lc_all=$ENV{LC_ALL} // \'{unset}\';\nmy $lc_ctype=$ENV{LC_CTYPE} // \'{unset}\';\nmy $lang=$ENV{LANG} // \'{unset}\';\n\n# Determine the current Windows code page\nmy ($active_codepage)=`chcp 2>NUL`=~/: (\\d+)/;\n\n# Our environment\nsay "ENV: LC_ALL=$lc_all LC_CTYPE=$lc_ctype …Run Code Online (Sandbox Code Playgroud) 这是一个关于CamelCase正则表达式的问题.随着tchrist post的组合,我想知道什么是正确的utf-8 CamelCase.
从(brian d foy's)正则表达式开始:
/
\b # start at word boundary
[A-Z] # start with upper
[a-zA-Z]* # followed by any alpha
(?: # non-capturing grouping for alternation precedence
[a-z][a-zA-Z]*[A-Z] # next bit is lower, any zero or more, ending with upper
| # or
[A-Z][a-zA-Z]*[a-z] # next bit is upper, any zero or more, ending with lower
)
[a-zA-Z]* # anything that's left
\b # end at word
/x
Run Code Online (Sandbox Code Playgroud)
并修改为:
/ …Run Code Online (Sandbox Code Playgroud) 当我尝试使用LWP :: Useragent和Encode进行字符编码从网页中撤回全局地址时,我在perl中有编码问题.我试过谷歌搜索解决方案,但似乎没有任何工作.我正在使用Strawberry Perl 5.12.3.
以美国驻捷克共和国大使馆的地址页为例(http://prague.usembassy.gov/contact.html).我想要的只是撤回地址:
地址:Tržiště15118 01 Praha 1 - MaláStrana捷克共和国
哪个firefox使用字符编码UTF-8正确显示,UTF-8与网页标题字符集相同.但是当我尝试使用perl将其拉回并将其写入文件时,尽管在Useragent或Encode :: decode中使用了decoding_content,编码看起来仍然搞砸了.
我已经尝试在数据上使用正则表达式来检查错误是不是在打印数据时(即内部在perl中正确)但错误似乎在于perl如何处理编码.
这是我的代码:
#!/usr/bin/perl
require Encode;
require LWP::UserAgent;
use utf8;
my $ua = LWP::UserAgent->new;
$ua->timeout(30);
$ua->env_proxy;
my $output_file;
$output_file = "C:/Documents and Settings/ian/Desktop/utf8test.txt";
open (OUTPUTFILE, ">$output_file") or die("Could not open output file $output_file: $!" );
binmode OUTPUTFILE, ":utf8";
binmode STDOUT, ":utf8";
# US embassy in Czech Republic webpage
$url = "http://prague.usembassy.gov/contact.html";
$ua_response = $ua->get($url);
if (!$ua_response->is_success) { die "Couldn't get data from $url";}
print 'CONTENT TYPE: …Run Code Online (Sandbox Code Playgroud) 我写了一个Perl脚本,打印出与Unicode属性匹配的字符.到目前为止,它似乎适用于大多数房产.
但它打印出ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ
ÿ匹配的字符[^\w].这些字符应该匹配\w.奇怪的是,他们匹配\p{Word}.
我试过没有成功:
map { decode ( "UTF-8", $_ ) }map { pack 'U0C*', unpack 'C*', $_ }如何使[^\w]这些单词字符不匹配?
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
binmode STDOUT, ':utf8';
my $c;
my $cols = 80;
my $arg = shift;
my $regex = qr/$arg/;
for ( map { chr } 0x20 .. 0xFFFF )
{
next if /\p{Unassigned}|\p{NChar}|\p{Cs}/;
if ( $_ =~ $regex )
{
print STDOUT;
print …Run Code Online (Sandbox Code Playgroud) 为什么length()说这是4个逻辑字符(我希望它说1):
$ perl -lwe 'print length("")'
4
Run Code Online (Sandbox Code Playgroud)
我想我的期望有些不对劲.:-) 它是什么?
这段代码:
perl -pe 's/^(\D\w+ \w+)( word )/\1;word/gi'
Run Code Online (Sandbox Code Playgroud)
当输入包含带有重音或特殊字符的单词时,此命令将不起作用: a?, ?.
规定:
我有这段代码可以统计唯一的艺术家文件。
find /PATH/ -type f -exec basename "{}" + 2>/dev/null |
perl -pe 's/ - .*//g' | LC_ALL=C sort -f | uniq -c -i|
gsed -e 's/$/;/'|
awk '{numero=$1;$1=""}{print $0,numero}'|
perl -pe 's/^(\D\w+ \w+)( & )/\1;&/g' |
perl -pe 's/^(\D\w+ \w+ \w+)( & >)/\1;&/g' |
perl -pe 's/^(\D\w+ \w+ \w+ \w+)( & )/\1;&/g' |
perl -pe >'s/^(\D\w+ \w+ \w+ \w+ \w+)( & )/\1;&/g' |
perl -pe 's/^(\D\w+ \w+)( Con …Run Code Online (Sandbox Code Playgroud)