我正在尝试编写一个测试查询字符串解析的例子,当我遇到Unicode问题时.简而言之,字母"Omega"(Ω)似乎没有被正确解码.
所以我写了这个测试程序验证我可以用URI :: Encode"解码"unicode查询字符串.
use strict;
use warnings;
use utf8::all; # use before Test::Builder clones STDOUT, etc.
use URI::Encode 'uri_decode';
use Test::More;
sub parse_query_string {
my $query_string = shift;
my @pairs = split /[&;]/ => $query_string;
my %values_for;
foreach my $pair (@pairs) {
my ( $key, $value ) = split( /=/, $pair );
$_ = uri_decode($_) for $key, $value;
$values_for{$key} ||= [];
push @{ $values_for{$key} } => $value;
}
return \%values_for;
}
my $omega …Run Code Online (Sandbox Code Playgroud) 我最近创建了一个Perl脚本,用以下代码搜索以D和E开头的单词:
$infile = 'words.txt';
open(IN, $infile);
$count = 0;
while ($word = <IN>) {
chomp($word);
if ($word =~ /^d\w*e$/i) {
print "$word\n";
$count++;
}
}
print "$count\n";
Run Code Online (Sandbox Code Playgroud)
我最近决定分叉代码并创建一个脚本,搜索一个单词,这个单词是六个字母,单词中的字母是按字母顺序排列的(A到Z).我打算使用位于usr/share/dict/words的Unix标准字典,而不是使用words.txt.如何通过修改此代码来实现此目的?
我有一些文本文件,其中包含许多Unicode希伯来语和希腊语,需要将它们包含在HTML <span class ="hebrew">...</span>元素中.这些文件属于已运行多年的项目.
大约八年前,我们成功地使用这个Perl脚本来完成这项工作.
#!/usr/bin/perl
use utf8;
my $table = [
{
FROM => "\\x{0590}",
TO => "\\x{05ff}",
REGEX => "[\\x{0590}-\\x{05ff}]",
OPEN => "<span class =\"hebrew\">",
CLOSE => "</span>",
},
{
FROM => "\\x{0370}",
TO => "\\x{03E1}",
REGEX => "[\\x{0370}-\\x{03E1}]|[\\x{1F00}-\\x{1FFF}]",
OPEN => "<span class =\"greek\">",
CLOSE => "</span>",
},
];
binmode(STDIN,":utf8");
binmode(STDIN,"encoding(utf8)");
binmode(STDOUT,":utf8");
binmode(STDOUT,"encoding(utf8)");
while (<>) {
my $line = $_;
foreach my $l (@$table) {
my $regex = $l->{REGEX},
my ($from, $to) = ($l->{FROM},$l->{TO});
my ($open, $close) …Run Code Online (Sandbox Code Playgroud) 试图在FastCGI下运行旧的CGI脚本.没有额外参数的打印可提供正确的输print $q->div( $q->param("text") )
但是当使用CGI方法的额外参数哈希打印出来时print $q->div( {-id=>"id"}, $q->param("text") ),它会破坏UTF-8形成的数据('õäöüžš' - >'ÃμÃÃÃÃÃÃÃüüžš
它只发生在CGI参数中,在脚本定义的变量中工作正常(例3和4).在普通的CGI(带有"-utf8"-flag)下,一切都很完美.
被称为FastCGI的示例脚本test.fcgi?text=õäöüžš应该给出四个相等的块:
#!/usr/bin/perl -w --
use strict;
use CGI::Fast qw(:all);
use locale;
use utf8;
BEGIN {
binmode(STDIN); # Form data
binmode(STDOUT, ':encoding(UTF-8)'); # HTML
binmode(STDERR, ':encoding(UTF-8)'); # Error messages
}
my ($q) = ();
my $test = "õäöüžš";
while ($q = new CGI::Fast) {
print $q->header(-type=>"text/html", -charset=>"utf-8"),
$q->start_html(-encoding=>"utf-8");
print "1: ",
$q->div( $q->param('text') ),
"<br />",
"2: ",
$q->div( {-id=>"id"}, $q->param('text') ),
"<br />", …Run Code Online (Sandbox Code Playgroud) 你好,我注意到当我使用UTF-8编码(没有BOM)保存文本文件时,我能够在C#上使用UTF-16编码完美地读取它.现在这让我有点困惑,因为UTF-8只使用了8位,对吧?utf-16对每个字符都需要16位.
现在想象一下,我把这个文件中的字符串"ab"写成UTF-8,那么字母"a"有一个字节,"b"有另一个字节.
好的,但是在使用UTF-16字符集时如何读取这个UTF-8文件呢?我看到,在读取文件的方式中,"AB"的两个字节会被误认为成只有一个包含两个字节字符了.因为UTF-16需要那2个字节.
这是我读它的方式(t.txt被编码为UTF-8):
using(StreamReader sr = new StreamReader(File.OpenRead("t.txt"), Encoding.GetEncoding("utf-16")))
{
Console.Write(sr.ReadToEnd());
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud) 我有一个二进制文件,我需要能够解析.我要做的是指定一个偏移量,然后让程序返回该位置的字节值.
我不确定的是如何解决这个问题.我有文件打开部分,但我不知道如何让程序跳转到该位置.
任何帮助,将不胜感激.
谢谢.
我的程序从数据源接收 UTF-8 编码的字符串。我需要篡改这些字符串,然后将它们作为 XML 结构的一部分输出。当我序列化我的 XML 文档时,它将被双重编码并因此被破坏。当我只序列化根元素时,它会很好,但当然缺少标题。
这是一段试图将问题可视化的代码:
use strict; use diagnostics; use feature 'unicode_strings';
use utf8; use v5.14; use encoding::warnings;
binmode(STDOUT, ":encoding(UTF-8)"); use open qw( :encoding(UTF-8) :std );
use XML::LibXML
# Simulate actual data source with a UTF-8 encoded file containing '¿Üß?çñíïì'
open( IN, "<", "./input" ); my $string = <IN>; close( IN ); chomp( $string );
$string = "Value of '" . $string . "' has no meaning";
# create example XML document as <response><result>$string</result></response>
my $xml = …Run Code Online (Sandbox Code Playgroud) 我需要有关imap文件夹编码的建议.
我是由我的邮件客户端(Thunderbird)imap文件夹与俄罗斯符号创建的.
文件夹名称是 - Проверка
文件系统上的文件夹名称是 - user.mylogin.&BB8EQAQ + BDIENQRABDoEMA-
我为convert编写了这段代码(perl v5.10.1)
use strict;
use warnings;
use utf8;
use Encode::IMAPUTF7;
my $folder=$ARGV[1];
binmode(STDOUT,':utf8');
if ($ARGV[0] eq 'to')
{ print Encode::IMAPUTF7::encode('IMAP-UTF-7', $folder) }
elsif ($ARGV[0] eq 'from')
{ print Encode::IMAPUTF7::decode('IMAP-UTF-7', $folder) }
print "\n";
Run Code Online (Sandbox Code Playgroud)
尝试将文件夹名称转换为俄语
[w@pandora6 tmp]$ ./imapfolder.pl from '&BB8EQAQ+BDIENQRABDoEMA-'
????????
Run Code Online (Sandbox Code Playgroud)
一切正常
尝试反向转换
[w@pandora6 tmp]$ ./imapfolder.pl to ????????
&ANAAnwDRAIAA0AC+ANAAsgDQALUA0QCAANAAugDQALA-
Run Code Online (Sandbox Code Playgroud)
嗯......我期待&BB8EQAQ + BDIENQRABDoEMA-
好的,编码回来
[w@pandora6 tmp]$ ./imapfolder.pl from '&ANAAnwDRAIAA0AC+ANAAsgDQALUA0QCAANAAugDQALA-'
ÐÑовеÑка
Run Code Online (Sandbox Code Playgroud)
WTF?我期待Проверка
什么地方出了错?
我试图在 perl 中理解 UTF8。
我有以下字符串 Alizéh。如果我查找这个字符串的十六进制,我会从https://onlineutf8tools.com/convert-utf8-to-hexadecimal得到 416c697ac3a968 (这与这个字符串的原始来源匹配)。
所以我认为打包该十六进制并将其编码为 utf8 应该会产生 unicode 字符串。但它产生了非常不同的东西。
有没有人能够解释我的错误?
这是一个简单的测试程序来展示我的工作。
#!/usr/bin/perl
use strict;
use warnings;
use Text::Unaccent;
use Encode;
use utf8;
binmode STDOUT, ':encoding(UTF-8)';
print "First test that the utf8 string Alizéh prints as expected\n\n";
print "=========================================== Hex to utf8 test start\n";
my $hexRepresentationOfTheString = '416c697ac3a968';
my $packedHexIntoPlainString = pack("H*", $hexRepresentationOfTheString);
print "The hex of the string is $hexRepresentationOfTheString\n";
print "The string after packing prints as $packedHexIntoPlainString\n";
utf8::encode($packedHexIntoPlainString);
print "Utf8 encoding the string …Run Code Online (Sandbox Code Playgroud) 我有一个我在Windows上编写的Perl程序.它始于:
$unused_header = <STDIN>;
my @header_fields = split('\|\^\|', $unused_header, -1);
Run Code Online (Sandbox Code Playgroud)
哪个应该拆分包含非常大的文件的输入:
The|^|Quick|^|Brown|^|Fox|!|
Run Code Online (Sandbox Code Playgroud)
成:
{The, Quick, Brown, Fox|!|}
Run Code Online (Sandbox Code Playgroud)
注意:这条线只是单独使用headre,而另一条线就像重复数据线一样.
它在Windows上运行得很好,但是在linux上却失败了.但是,如果我在Perl中定义一个具有相同内容的字符串,并在其上运行拆分,它可以正常工作.
我认为这是一个UTF-16编码处理问题,但我不知道如何处理它.有谁知道我怎么能得到perl才能理解被传输到STDIN的UTF-16?
我发现:http://www.haboogo.com/matching_patterns/2009/01/utf-16-processing-issue-in-perl.html但我不知道该怎么做.
Perl中用于确定值是字节序列还是编码字符串的标准测试是什么?如果它是一个编码字符串,它的字符编码是什么?
我们假设以下完整的Perl脚本:
'foo';
Run Code Online (Sandbox Code Playgroud)
如何判断这个文字字符串是一个字节序列还是某些编码中的字符串?如果它是某些字符编码中的字符串,那么它的字符编码是什么?
这个问题与Unicode或UTF-8无关.它通常与Perl中的字节与字符有关.这个问题也不是关于自动字符编码检测,这完全是一个不同的主题.
UPDATE
在初始化之后$letter,我希望Perl告诉我它认为存储在变量中的字母是什么字符编码$letter.我不认为它必然是正确的.确保Perl理解字母编码的字符是我作为程序员的责任.我明白了.但是应该有一种简单,简单的方法来测试Perl认为字符(或字符串)所在的字符编码.不存在吗?
C:\>perl -E "$letter = 'Ž'; say $letter =~ m/\w/ ? 'matches' : 'does not match'"
does not match
C:\>perl -MEncode -E "$letter = decode('UTF-8', 'Ž'); say $letter =~ m/\w/ ? 'matches' : 'does not match'"
does not match
C:\>perl -MEncode -E "$letter = decode('Windows-1252', 'Ž'); say $letter =~ m/\w/ ? 'matches' : 'does not match'"
matches
C:\>perl -MEncode -E "$letter = decode('Windows-1252', 'Ž'); $letter = encode('Windows-1252', $letter); …Run Code Online (Sandbox Code Playgroud) 我试图通过运行perl脚本来删除我的文本中的重音符号,其中我使用tr运算符(我发现的更简单的方法):
我试过了:
tr/àâäéèëêîïôöûùüç/aaaeeeeiioouuuc/;
Run Code Online (Sandbox Code Playgroud)
它删除了重音,但是我得到了'aa'而不是'a','ae'而不是'e'等字符.
当我尝试在perl中向变量插入版权符号值时,它转换为另一个符号
我需要
$a=©;
Run Code Online (Sandbox Code Playgroud)
但我得到了这样的
$a =©
Run Code Online (Sandbox Code Playgroud)
请给我解决方案