संक्षिप्त उत्तर: उपयोग utf8 जोड़ें; यह सुनिश्चित करने के लिए कि स्रोत कोड में आपकी शाब्दिक स्ट्रिंग को utf8 के रूप में समझाया गया है, जिसमें परीक्षण स्ट्रिंग की सामग्री और regexp की सामग्री शामिल है।
लांग जवाब:
#!/usr/bin/env perl
use warnings;
use Encode;
my $word = 'cɞi¤r$c❤u¨s';
foreach my $char (split //, $word) {
print ord($char) . Encode::encode_utf8(":$char ");
}
my $allowed_chars = 'a-zöäåA-ZÖÄÅ';
print "\n";
foreach my $char (split //, $allowed_chars) {
print ord($char) . Encode::encode_utf8(":$char ");
}
print "\n";
$word =~ s/[^$allowed_chars]//g;
printf Encode::encode_utf8("$word\n");
UTF8 के बिना इसे निष्पादित:
$ perl utf8_regexp.pl
99:c 201:É 158: 105:i 194:Â 164:¤ 114:r 36:$ 99:c 226:â 157: 164:¤ 117:u 194:Â 168:¨ 115:s
97:a 45:- 122:z 195:Ã 182:¶ 195:Ã 164:¤ 195:Ã 165:¥ 65:A 45:- 90:Z 195:Ã 150: 195:Ã 132: 195:Ã 133:
ci¤rc¤us
UTF8 के साथ निष्पादित:
$ perl -Mutf8 utf8_regexp.pl
99:c 606:ɞ 105:i 164:¤ 114:r 36:$ 99:c 10084:❤ 117:u 168:¨ 115:s
97:a 45:- 122:z 246:ö 228:ä 229:å 65:A 45:- 90:Z 214:Ö 196:Ä 197:Å
circus
स्पष्टीकरण:
गैर- ASCII वर्ण कि तुम एक अपने स्रोत कोड में फिर से टाइप करना अधिक बाइट से एक द्वारा दर्शाया जाता है। चूंकि आपका इनपुट utf8 एन्कोड किया गया है। एक शुद्ध एसीआई या लैटिन -1 टर्मिनल में वर्ण एक बाइट होता।
utf8 मॉड्यूल का उपयोग नहीं करते समय, पर्ल सोचता है कि प्रत्येक बाइट जो आप इनपुट कर रहे हैं वह एक अलग चरित्र है, जैसे आप प्रत्येक और प्रत्येक चरित्र को विभाजित और प्रिंट करते समय देख सकते हैं। Utf8 मॉड्यूल का उपयोग करते समय, यह कई बाइट्स के संयोजन को एक वर्ण के रूप में सही ढंग से utf8 एन्कोडिंग के नियमों के अनुसार व्यवहार करता है।
आप coinscidence से देख सकते हैं, बाइट्स कि स्वीडिश पात्रों बाइट्स कि अपने परीक्षण स्ट्रिंग में वर्णों की कुछ के बने होते हैं में से कुछ के साथ मैच के बने होते हैं, और वे रखा जाता हैं। अर्थात्: यूओएफ 8 में यूएफ 8 में शामिल हैं: Ã 164: ¤ - 164 आपके द्वारा अनुमत वर्णों में से एक के रूप में समाप्त होता है और यह गुजरता है।
समाधान यह है कि आपके तारों को utf-8 के रूप में माना जाना चाहिए।
encode_utf8 कॉल जगह विस्तृत वर्णों के बारे में चेतावनी से बचने के लिए कर रहे हैं टर्मिनल के लिए मुद्रित किया जा रहा। हमेशा की तरह आप एनकोड उत्पादन वर्ण एन्कोडिंग के अनुसार कि इनपुट या आउटपुट संभाल/में कार्य करते हैं।
आशा इस यह स्पष्ट कर दिया जाता है इनपुट को डिकोड करने की जरूरत है, और।
कौन सा संस्करण पर्ल आप के साथ काम कर रहे हैं? यूनिकोड समर्थन धीरे-धीरे जोड़ा और परिष्कृत किया गया था। कम से कम 5.12 के साथ काम करने का प्रयास करें, और कोरोबा के जवाब को देखें। संस्करण को मुद्रित करने के लिए 'perl -v'। [पर्ल यूनिकोड के लिए मैनुअल] (http://perldoc.perl.org/perlunicode.html) – cfi
संस्करण v5.12.4 – Pithikos
क्यों अनुभवी प्रोग्रामर सवालों के बदलते रहते हो रहा है? अब मेरे (कम) अनुभव का कोई भी उपयोगकर्ता कभी भी अपने प्रश्न का उत्तर नहीं ढूंढ रहा है। – Pithikos