2009-12-28 15 views
22

मेरे पास यूनिकोड स्ट्रिंग है और यह नहीं पता कि इसकी एन्कोडिंग क्या है। जब यह स्ट्रिंग एक पर्ल प्रोग्राम द्वारा पढ़ी जाती है, तो क्या एक डिफ़ॉल्ट एन्कोडिंग है जो पर्ल का उपयोग करेगा? यदि हां, तो मैं यह कैसे पता लगा सकता हूं कि यह क्या है?मैं पर्ल में एक स्ट्रिंग के एन्कोडिंग का अनुमान कैसे लगा सकता हूं?

मैं इनपुट से गैर-ASCII वर्णों से छुटकारा पाने की कोशिश कर रहा हूं। मुझे यह कुछ मंच पर मिला जो

my $line = encode('ascii', normalize('KD', $myutf), sub {$_[0] = ''}); 

कोई इनपुट एन्कोडिंग निर्दिष्ट नहीं होने पर यह उपरोक्त कैसे काम करेगा? क्या इसे इस तरह निर्दिष्ट किया जाना चाहिए?

my $line = encode('ascii', normalize('KD', decode($myutf, 'input-encoding'), sub {$_[0] = ''}); 
+1

मुझे सही अगर मैं गलत हूँ डिक्रिप्ट करने के लिए भी निम्नलिखित कोड का उपयोग कर सकते है, लेकिन मैंने सोचा था कि यूनिकोड के पूरे मुद्दे यह नहीं है कि है एक "एन्कोडिंग" - सबकुछ वहां है। –

+3

आपके पास यूनिकोड स्ट्रिंग नहीं है। आपके पास बाइट्स से भरा फ़ाइल है जो कुछ एन्कोडिंग में यूनिकोड स्ट्रिंग का प्रतिनिधित्व करती है। यदि आप फ़ाइल के एन्कोडिंग को नहीं जानते हैं, तो फ़ाइल की शुरुआत में बाइट-ऑर्डर-मार्कर की जांच करें। यदि कोई बीओएम नहीं है, तो आप भाग्य से बाहर हैं। –

+0

ऐसा लगता है कि आप कम से कम दो अलग-अलग प्रश्न पूछ रहे हैं (पहला और दूसरा पैराग्राफ)। – Amnon

उत्तर

29

पता लगाने के लिए कि कौन सी अज्ञात उपयोग करता है, आपको बस कोशिश करने और देखने की ज़रूरत है। मॉड्यूल Encode::Detect और Encode::Guess स्वचालित करें। (यदि आपको परेशानी संकलन एनकोड :: का पता लगाने है, तो इसकी कांटा Encode::Detective आज़मा सकते हैं।)

use Encode::Detect::Detector; 
my $unknown = "\x{54}\x{68}\x{69}\x{73}\x{20}\x{79}\x{65}\x{61}\x{72}\x{20}". 
       "\x{49}\x{20}\x{77}\x{65}\x{6e}\x{74}\x{20}\x{74}\x{6f}\x{20}". 
       "\x{b1}\x{b1}\x{be}\x{a9}\x{20}\x{50}\x{65}\x{72}\x{6c}\x{20}". 
       "\x{77}\x{6f}\x{72}\x{6b}\x{73}\x{68}\x{6f}\x{70}\x{2e}"; 
my $encoding_name = Encode::Detect::Detector::detect($unknown); 
print $encoding_name; # gb18030 

use Encode; 
my $string = decode($encoding_name, $unknown); 

मुझे लगता है encode 'ascii' गैर- ASCII वर्ण से छुटकारा पाने के लिए एक लंगड़ा समाधान है। सब कुछ प्रश्न चिह्नों के साथ प्रतिस्थापित किया जाएगा; यह उपयोगी होने के लिए बहुत हानिकारक है।

# Bad example; don't do this. 
use utf8; 
use Encode; 
my $string = 'This year I went to 北京 Perl workshop.'; 
print encode('ascii', $string); # This year I went to ?? Perl workshop. 

आप पठनीय ASCII पाठ चाहते हैं, मैं Text::Unidecode बजाय सलाह देते हैं। यह भी एक हानिकारक एन्कोडिंग है, लेकिन ऊपर encode के रूप में भयानक नहीं है।

use utf8; 
use Text::Unidecode; 
my $string = 'This year I went to 北京 Perl workshop.'; 
print unidecode($string); # This year I went to Bei Jing Perl workshop. 

हालांकि, अगर आप इसकी सहायता कर सकते हैं तो उन हानिकारक एन्कोडिंग से बचें। यदि आप बाद में ऑपरेशन को रिवर्स करना चाहते हैं, तो PERLQQ या XMLCREF में से कोई एक चुनें।

use utf8; 
use Encode qw(encode PERLQQ XMLCREF); 
my $string = 'This year I went to 北京 Perl workshop.'; 
print encode('ascii', $string, PERLQQ); # This year I went to \x{5317}\x{4eac} Perl workshop. 
print encode('ascii', $string, XMLCREF); # This year I went to 北京 Perl workshop. 
+0

मुझे प्राप्त इनपुट हमेशा लैटिन चरित्र-सेट का उपयोग करता है। मेरे द्वारा उपयोग किए जाने वाले सामान्यीकृत कार्य को "कैफे" से "कैफे" में परिवर्तित कर दिया जाएगा। हालांकि यह सभी मामलों में काम नहीं करता है। यह देखते हुए, क्या आप अभी भी PERLQQ या XMLCREF विधि का उपयोग करना पसंद करेंगे? – Maulin

+0

इससे कोई फर्क नहीं पड़ता कि मैं क्या पसंद करता हूं - यह आपका कोड और ज़िम्मेदारी है, और केवल आप ही सभी परिस्थितियों को जानते हैं। यदि आप वास्तव में कैफे → कैफे से खुश हैं, तो अपने कस्टम फ़ंक्शन को 'टेक्स्ट :: यूनिडोड कोड' से बदलें। यह सभी मामलों में काम करता है। – daxim

+0

धन्यवाद। मुझे लगता है कि मैं कोशिश करूँगा। – Maulin

3

Encode मॉड्यूल एक तरीका है कि आप ऐसा करने की कोशिश कर सकते हैं। आप decode कच्चे ऑक्टेट्स जो आपको लगता है कि एन्कोडिंग क्या है। यदि ऑक्टेट्स वैध एन्कोडिंग का प्रतिनिधित्व नहीं करते हैं, तो यह उड़ाता है और आप इसे एक eval के साथ पकड़ते हैं। अन्यथा, आप एक उचित एन्कोडेड स्ट्रिंग वापस प्राप्त करते हैं। उदाहरण के लिए:

use Encode; 

my $a_with_ring = 
    eval { decode('UTF-8', "\x6b\xc5", Encode::FB_CROAK) } 
    or die "Could not decode string: [email protected]"; 

इस दोष यह है कि एक ही ओकटेट अनुक्रम से अधिक एन्कोडिंग

मैं और अधिक आगामी Effective Perl Programming, 2nd Edition, जो यूनिकोड से निपटने पर एक पूरा अध्याय है में इस बारे में कहना है में मान्य हो सकता है । मुझे लगता है कि अगर मैं पूरी चीज पोस्ट करता हूं तो मेरा प्रकाशक पागल हो जाएगा। :)

आप Juerd's Unicode Advice, साथ ही कुछ यूनिकोड दस्तावेज़ जो पर्ल के साथ आते हैं, देखना चाहते हैं।

-4

आप एन्क्रिप्ट और कोड

sub ENCRYPT_DECRYPT() { 
    my $Str_Message=$_[0]; 
    my $Len_Str_Message=length($Str_Message); 

    my $Str_Encrypted_Message=""; 
    for (my $Position = 0;$Position<$Len_Str_Message;$Position++){ 
     my $Key_To_Use = (($Len_Str_Message+$Position)+1); 
      $Key_To_Use =(255+$Key_To_Use) % 255; 
     my $Byte_To_Be_Encrypted = substr($Str_Message, $Position, 1); 
     my $Ascii_Num_Byte_To_Encrypt = ord($Byte_To_Be_Encrypted); 
     my $Xored_Byte = $Ascii_Num_Byte_To_Encrypt^$Key_To_Use; 
      my $Encrypted_Byte = chr($Xored_Byte); 
     $Str_Encrypted_Message .= $Encrypted_Byte; 

    } 
    return $Str_Encrypted_Message; 
} 

my $var=&ENCRYPT_DECRYPT("hai"); 
print &ENCRYPT_DECRYPT($var); 
+0

प्रश्न टेक्स्ट एन्कोडिंग के बारे में था, और एन्क्रिप्शन के बारे में नहीं। – Flimm

संबंधित मुद्दे