2017-03-20 8 views
2

2つの「同一」文字列の大文字への変換に非常に奇妙な問題が発生しました。プログラムは、ウェブサイトから行を読み込み、それをテキストファイルに保存された行と比較します。行が見つからない場合は、ファイルの最後に追加します。行に特殊文字が含まれていない限り、これは完全に機能します。何らかの理由で、比較結果が不一致になります。私は最初に大文字に変換して2つの文字列を比較し、それが間違っています。以下はいくつかのコードです。私は2つの変数が満たされている部分を省略しました。私は奇妙な部分を見せているだけです。最初のE(同じように)同じ文字列が大文字に別々に変換されました

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

お知らせで

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

この結果は大文字に変換されていません。

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フラグがオフの場合。これは、以下を追加することによって、固定されただ[1]ユニコードバグのインスタンスの:

use feature qw(unicode_strings); 

上記次のように追加することによって間接的に行うことができる。

use 5.012; 

参考文献:unicode_stringsfeatureuse


  1. コードの動作が文字列の格納形式に依存する場合、そのコードはUnicodeバグに苦しんでいると言われています。
+0

それは本当に問題を解決しました。 :) "use strict;"の代わりに保存されますか? 「5.012を使用する」;私のすべてのモジュールで? – Zippy1970

+1

はい。 "*同様に、指定されたPerlのバージョンが5.12.0以上の場合、strictは" use strict * "と同様に字句的に有効になります。 – ikegami

関連する問題