2011-11-25 14 views
6

में विशिष्ट विशेष वर्णों के लिए काम नहीं करता है मैं विशेष वर्ण से छुटकारा नहीं मिल सकता है ¤ और ❤ एक स्ट्रिंग में:Regexp पर्ल

$word = 'cɞi¤r$c❤u¨s'; 
$word =~ s/[^a-zöäåA-ZÖÄÅ]//g; 
printf "$word\n"; 

दूसरी पंक्ति मैं दूर करने की कोशिश पर स्ट्रिंग $word स्ट्रिंग से गैर वर्णमाला वर्ण। मैं शब्द सर्कस मुद्रित पाने के लिए उम्मीद करेंगे, लेकिन इसके बजाय मैं:

ci�rc�us 

OAA और OAA अभिव्यक्ति में स्वीडिश वर्णमाला में बस सामान्य अक्षर हैं जो मैं शामिल करने की जरूरत है।

+0

कौन सा संस्करण पर्ल आप के साथ काम कर रहे हैं? यूनिकोड समर्थन धीरे-धीरे जोड़ा और परिष्कृत किया गया था। कम से कम 5.12 के साथ काम करने का प्रयास करें, और कोरोबा के जवाब को देखें। संस्करण को मुद्रित करने के लिए 'perl -v'। [पर्ल यूनिकोड के लिए मैनुअल] (http://perldoc.perl.org/perlunicode.html) – cfi

+0

संस्करण v5.12.4 – Pithikos

+0

क्यों अनुभवी प्रोग्रामर सवालों के बदलते रहते हो रहा है? अब मेरे (कम) अनुभव का कोई भी उपयोगकर्ता कभी भी अपने प्रश्न का उत्तर नहीं ढूंढ रहा है। – Pithikos

उत्तर

11

यदि वर्ण आपके स्रोत कोड में हैं, तो use utf8 पर सुनिश्चित करें। अगर उन्हें एक फाइल से पढ़ा जा रहा है, binmode $FILEHANDLE, ':utf8'

perldoc perlunicode पढ़ने के लिए सुनिश्चित रहें।

+0

एन्कोडिंग सही है के रूप में मैं कर सकते हैं 'printf 'cɞi¤r $ c❤u¨söäå';' समस्या के बिना। जब मैं नियमित अभिव्यक्ति चलाता हूं तो समस्या आती है। मुद्रण/ – Pithikos

+1

तुम भी 'बिना उपयोग utf8' स्ट्रिंग मुद्रित कर सकते हैं, लेकिन इस तरह के एक मामले में, पर्ल है _bytes_: ** OAA ** regexp से समस्या का हल है, लेकिन फिर मैं अपने स्ट्रिंग में उन वर्णों का उपयोग नहीं कर सकते निकाला जा रहा है , _characters_ नहीं। यही कारण है कि यह regex में वर्णों को पहचान नहीं है। क्या आपने 'पर्लुनिकोड' पढ़ा है? – choroba

-7

pointed out by choroba के रूप में, पर्ल स्क्रिप्ट की शुरुआत में इस जोड़ने यह हल करती है:

use utf8; 
binmode(STDOUT, ":utf8"); 

जहां use utf8 आप नियमित अभिव्यक्ति में सही ढंग से विशेष वर्ण का उपयोग करने देता और binmode(STDOUT, ":utf8") पर सही ढंग से आप की सुविधा देता है उत्पादन विशेष वर्ण खोल।

+3

यह वोरोबा पहले ही सुझाया गया है। आप उसके उत्तर की एक प्रति क्यों प्रदान करते हैं? इसके बजाय "उत्तर" (और उसे भी ऊपर उठाएं) के साथ कोरोबा को पुरस्कृत करें (और फिर अपना उत्तर हटाएं) – cfi

+0

क्योंकि मेरा उत्तर अधिक व्यावहारिक है। मैं उसके साथ प्रतिस्पर्धा करने की कोशिश नहीं करता हूं। मैं भविष्य के उपयोगकर्ताओं के लिए विस्तृत करने की कोशिश करता हूं जो एक ही समस्या पर ढेर हो जाते हैं। मेरी राय में बेहतर जवाब। – Pithikos

+2

@ पिथिकोस, आप इसे अपने उत्तर में एक मामूली टिप्पणी के रूप में जोड़ सकते हैं, खासकर यदि यह आपको रास्ता दिखाता है। – Qtax

3

संक्षिप्त उत्तर: उपयोग 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 कॉल जगह विस्तृत वर्णों के बारे में चेतावनी से बचने के लिए कर रहे हैं टर्मिनल के लिए मुद्रित किया जा रहा। हमेशा की तरह आप एनकोड उत्पादन वर्ण एन्कोडिंग के अनुसार कि इनपुट या आउटपुट संभाल/में कार्य करते हैं।

आशा इस यह स्पष्ट कर दिया जाता है इनपुट को डिकोड करने की जरूरत है, और।

+0

ब्लाह, ओवरलैपिंग उत्तर देने के लिए खेद है। यदि आप चाहें तो इसे हटाने या डाउनवोट करने के लिए स्वतंत्र महसूस करें; - / – nicomen