相关疑难解决方法(0)

在Perl中测试查询字符串unicode处理

我正在尝试编写一个测试查询字符串解析的例子,当我遇到Unicode问题时.简而言之,字母"Omega"(Ω)似乎没有被正确解码.

  • Unicode:U + 2126
  • 3字节序列:\ xe2\x84\xa6
  • URI编码:%E2%84%A6

所以我写了这个测试程序验证我可以用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)

testing unicode perl query-string

3
推荐指数
2
解决办法
817
查看次数

如何按字母顺序搜索带有字母的六个字母的单词

我最近创建了一个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.如何通过修改此代码来实现此目的?

regex perl

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

在DATA和ARGV文件句柄上进行Perl UTF-8编码

我有一些文本文件,其中包含许多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)

unicode perl utf-8

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

如何强制FastCGI将表单数据编码为UTF-8,因为CGI.pm有选项?

试图在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)

perl cgi fastcgi utf-8

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

需要帮助理解UTF编码

你好,我注意到当我使用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)

c# encoding utf-8 utf-16 utf

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

Perl - 解析二进制文件并返回指定偏移量的值

我有一个二进制文件,我需要能够解析.我要做的是指定一个偏移量,然后让程序返回该位置的字节值.

我不确定的是如何解决这个问题.我有文件打开部分,但我不知道如何让程序跳转到该位置.

任何帮助,将不胜感激.

谢谢.

binary perl hex offset

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

如何避免 XML::LibXML 中的双重 UTF-8 编码

我的程序从数据源接收 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)

perl utf-8 libxml2

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

PERL | IMAP文件夹编码.UTF8 - > UTF7 - > UTF8 =失败

我需要有关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 encoding utf-8

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

将十六进制转换为 UTF8 在 perl 中无法按预期工作

我试图在 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)

perl utf-8

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

Windows Perl - >端口后Unix无法正常工作,可能出现编码问题

我有一个我在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但我不知道该怎么做.

linux windows perl port encoding

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

Perl中的标准测试是什么来确定值是编码字符串还是字节序列?

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 character-encoding

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

使用tr运算符删除perl的重音符号

我试图通过运行perl脚本来删除我的文本中的重音符号,其中我使用tr运算符(我发现的更简单的方法):

我试过了:

tr/àâäéèëêîïôöûùüç/aaaeeeeiioouuuc/;
Run Code Online (Sandbox Code Playgroud)

它删除了重音,但是我得到了'aa'而不是'a','ae'而不是'e'等字符.

unicode perl ascii

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

Unix版权符号不起作用

当我尝试在perl中向变量插入版权符号值时,它转换为另一个符号

我需要

$a=©;
Run Code Online (Sandbox Code Playgroud)

但我得到了这样的

$a =©
Run Code Online (Sandbox Code Playgroud)

请给我解决方案

unix perl

0
推荐指数
1
解决办法
1001
查看次数

标签 统计

perl ×12

utf-8 ×6

encoding ×3

unicode ×3

ascii ×1

binary ×1

c# ×1

cgi ×1

character-encoding ×1

fastcgi ×1

hex ×1

libxml2 ×1

linux ×1

offset ×1

port ×1

query-string ×1

regex ×1

testing ×1

unix ×1

utf ×1

utf-16 ×1

windows ×1