我有一個MySql資料庫,它存盤了使用XML型別格式編碼的Unicode字符的字串(即,&#nnnnn;)。 其中一個字串的例子是:概述,它代表Unicode字符:概述
。如果我對字串的格式進行硬編碼,Perl可以讓我在我的應用程式中進行這樣的轉換:
x{6982}x{8ff0}或者甚至。 N{U 6982}N{U 8ff0}
對我來說,這似乎是一個簡單的問題,將格式從&#nnnnn;改為x{nnnn}
。
Perl應用程式似乎需要十六進制數字,而MySql輸出的是整數。
我想在 Regex 中進行這種簡單的轉換。 因此,我用以下方法來匹配整數:
m/&#(d{3,5});/;
然后我用以下方法將匹配結果轉換為十六進制。
sprintf('{x}',$1)
然后我加入了必要的:x{ }
。
我很容易就能創建包含以下內容的字串。"x{6982}x{8ff0}"
但這些字串都沒有被應用程式列印成Unicode。 它們只是按照創建時的樣子被列印出來:符號和文本。
我發現,如果你在程式中硬編碼這些字串,Perl 會將它們 "插值 "為 Unicode 字符。 但是如果它們被創建為一個字串,"插值 "就不會發生。
我試圖通過使用各種函式來強制進行插值,例如:
Encode::decode('UTF-8', "some string" );
Encode::encode('UTF-8', "some string");
但這并不是這些函式的目的。
我還試著用Perl的手動字串插值法
$v="${ ($v) }"/span>;
但是這并沒有將字串 "x{6982}x{8ff0}"轉換成Unicode。 它只是保持了與之前相同的字串。
我遇到了一個例子。
我遇到了一個使用 "eval() "的例子。
while($unicodeString =~ m/&#(d{3,5});/) {
$_=$unicodeString; ##以XML的形式(為了讓你在這里看到它,加了空格): & #27010; & #36848;
m/&#(d{3,5});/; ## 匹配Unicode中的整數。
my $y=q(x).sprintf('{x}',$1); ##將整數轉換成十六進制并加上x{}。
my $v = eval qq{"$y"}; ## 對字串進行插值,得到Unicode。
$unicodeString =~ s/&#(d{3,5});/$v/; ##用新的Unicode字符替換舊代碼。
}
這種轉換現在可以作業。 但我對重復使用eval()來轉換每個字符感到不滿意:一次一個。 我可以在While回圈中建立我的字串,然后簡單地評估()新的字串。 但我更希望只評估()那些在Regex中被特別匹配的小字串。
是否有更好的方法將一個 XML 字串(Unicode 字符顯示為整數)轉換為包含實際 Unicode 字符的字串?
我怎樣才能輕松地從一個包含以下內容的字串。
我认识到自己的长处和& #30701;处,并追求自我发展。
到一個與:
我認識到自己的長處和短處,并追求自我發展。
我需要轉換的檔案包含成千上萬的這些字符。
uj5u.com熱心網友回復:
下面是一個簡單的例子,你可以使用chr函式來替換unicode轉義:
use feature qw(say)。
use strict;
使用警告。
use open qw( :encoding(utf-8) :std ) 。
my $str = "概述";
$str =~ s/&#(d );/chr 1/eg;
printf "%vX
", $str;
say $str;
輸出:
6982.8FF0。
概述
uj5u.com熱心網友回復:
我沒有找到解碼XML物體的模塊,因為它們通常只在XML中出現,而且XML決議器會處理它們。但是,這很容易重新創建。
use feature qw( say state ) 。
sub decode_xml_entities_inplace{
state $ents = {
amp => "&"。
lt => "<",
gt => ">"。
quot => '" '。
apos => "'"。
};
$_[0] =~ s{
&
(?: # (?: x([0-9a-fA-F] )
| ([0-9] )
)
| (w )
)
;
}{
if (defined(1)) { chr(hex(1)) }
elsif (defined(2)) { chr(2) }
else { $ents->{$3} // $& }
}xeg;
}
my $s = "概述"/span>;
decode_xml_entities_inplace($s)。
say $s。
當然,如果你只需要處理十進制的數字物體,上面的內容可以簡化為
。use feature qw( state )。
my $s = "概& #36848;"。
$s =~ s{ &# ([0-9] ) ; }{ chr(1) }xeg;
say $s;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/311346.html
標籤:
上一篇:在perl腳本中運行gam命令
