2017-03-20 61 views
2

我遇到了一個非常奇怪的問題,轉換爲兩個「相同」字符串的大寫字母。該程序正在讀取來自網站的行,並將其與存儲在文本文件中的行進行比較。如果找不到該行,則將其添加到文件的末尾。除非行中包含特殊字符,否則此功能將完美工作出於某種原因,比較結果不匹配。我比較兩個字符串,先將它們轉換爲大寫字母,這就是它出錯的地方。以下是一些代碼。我省略了填充兩個變量的部分。我只是展示了怪異的部分。(看起來)相同的字符串轉換爲大寫不同

print "$pageLine <-> $dbLine\n"; 
print uc($pageLine) . " <-> " . uc($dbLine) . "\n"; 

這導致

Diëtisten <-> Diëtisten 
DIëTISTEN <-> DIËTISTEN 

請注意,在第一E不轉換爲大寫。

foreach my $kar (split(//, $pageLine)) { 
    print ord($kar) . ":"; 
} 
print "\n"; 
foreach my $kar (split(//, $dbLine)) { 
    print ord($kar) . ":"; 
} 
print "\n"; 

這導致:

68:105:235:116:105:115:116:101:110:32:40:78:86:68:41: 
68:105:235:116:105:115:116:101:110:32:40:78:86:68:41: 

任何人有任何想法是怎麼回事?

在此先感謝。

+2

http://perldoc.perl.org/functions/fc.html也可能是一個很好的閱讀。 – simbabque

回答

6

最小示範:

my $s = "\xEB"; 
utf8::downgrade(my $d = $s); 
utf8::upgrade( my $u = $s); 
printf "%vX %vX %s\n", $d, $u, $d eq $u ? "same" : "different"; 
$_ = uc($_) for $d, $u; 
printf "%vX %vX %s\n", $d, $u, $d eq $u ? "same" : "different"; 

輸出:

EB EB same 
EB CB different 

默認情況下,爲了向後兼容,uc只會大寫ASCII字符,如果輸入的標量的UTF8標誌爲無效。這是Unicode的錯誤的一個實例[1]該真實通過添加固定如下:

use 5.012; 

參考文獻::

use feature qw(unicode_strings); 

上面可以間接通過添加以下完成unicode_stringsfeatureuse


  1. 當代碼的行爲取決於字符串的存儲格式時,該代碼被認爲受到Unicode錯誤的影響。
+0

這確實解決了這個問題。 :) 是否替代「使用嚴格」保存?用「使用5.012」;在我所有的模塊? – Zippy1970

+1

是的。 「*類似地,如果指定的Perl版本大於或等於5.12.0,那麼在使用strict * – ikegami

相關問題