2009-11-09 20 views
5

में XML :: Twig का उपयोग कर भ्रष्टाचार और गैर-मुद्रित वर्णों को स्ट्रिंग करना यह वास्तव में अजीब समस्या है। यह मुझे व्यावहारिक रूप से पूरे दिन ले जाता है ताकि इसे एक छोटी निष्पादन योग्य लिपि में घुमाया जा सके जो पूरी तरह से समस्या का प्रदर्शन करता है।Win32 पर्ल

समस्या का सारांश: मैं XML::Twig उपयोग कर रहा हूँ एक XML फ़ाइल से एक डेटा टुकड़ा खींचने के लिए, तो मैं चिपका रहा है कि डेटा डेटा का एक और टुकड़ा के बीच में स्निपेट के यह माता पिता डेटा फोन करते हैं। जब मैं शुरू करता हूं तो अभिभावक डेटा में इसकी शुरुआत में यह अजीब गैर-प्रिंट करने योग्य चरित्र होता है। यह विक्रेता डेटा प्रदान करता है, इसलिए मैं इसे नियंत्रित नहीं कर सकता। मेरी समस्या यह है कि जब मैं मूल डेटा के मध्य में डेटा स्निपेट चिपकता हूं, तो अंतिम उत्पाद में नया मूल रूप से शुरू होने वाले इसके अलावा इसकी शुरुआत में गैर-प्रिंट करने योग्य वर्ण होता है। यह नया गैर-प्रिंट करने योग्य चरित्र माता-पिता डेटा में नहीं था और न ही बाल डेटा स्निपेट में था। मुझे नहीं पता कि यह कहां से आ रहा है और न ही यह मेरे डेटा में कैसे हो रहा है।

मुझे संदेह है कि यह एक एक्सएमएल :: ट्विग बग है क्योंकि स्ट्रिंग भ्रष्टाचार थोड़ी देर में फ़ाइलहेडल से एक लाइन पढ़ने के दौरान होता है, लेकिन जब मैं एक्सएमएल को हटाता हूं तो मैं अपनी समस्या को पुनर्जीवित करने में असफल रहा हूं: : मेरी स्क्रिप्ट में ट्विग कोड इसलिए मुझे इसे छोड़ना पड़ा।

यह स्ट्रिंग्स में गैर-प्रिंट करने योग्य वर्णों के साथ मेरा पहला अनुभव है जिसे मैं संसाधित करने की कोशिश कर रहा हूं। क्या मुझे साधारण तारों या कुछ की तरह व्यवहार करने के बजाय कुछ खास करने की ज़रूरत है?

मैं एक्टिवस्टेट पर्ल 5.10.1 और एक्सएमएल :: ट्विग 3.32 (नवीनतम) और विंडोज एक्सपी पर ग्रहण 3.5.1 आईडीई का उपयोग कर रहा हूं।

ERROR: What happened? 
ORIGINAL: 
¿(********************************************* 
     Data-File-Header-Junk 
    **********************************************) 

     PROGRAM MainProgram() 
     END_PROGRAM 

     TASK SecondaryTask() 
     END_TASK 

     TASK MainTask() 
      MainProgram; 
     END_TASK 

MODIFIED: 
¿(********************************************* 
     Data-File-Header-Junk 
    **********************************************) 

     PROGRAM KurtsProgram() 
     END_PROGRAM 

     PROGRAM MainProgram() 
     END_PROGRAM 

     TASK SecondaryTask() 
     END_TASK 

     TASK MainTask() 
      MainProgram; 
      KurtsProgram; 
     END_TASK 

आप अतिरिक्त चरित्र है कि में जोड़ा गया था देख सकते हैं:

use strict; 
use warnings; 
use XML::Twig; 

my $FALSE = 0; 
my $TRUE = 1; 
my $name = 'KurtsProgram'; 
my $task = 'MainTask'; 
my $hidden_char = "\xBF"; 
my $data = $hidden_char . 
'(********************************************* 
    Data-File-Header-Junk 
**********************************************) 

    PROGRAM MainProgram() 
    END_PROGRAM 

    TASK SecondaryTask() 
    END_TASK 

    TASK MainTask() 
     MainProgram; 
    END_TASK 
'; 
my $new_data = insertProgram($name, $task, $data); 

# test to see if results start out as expected 
if ($new_data =~ m/^\Q$hidden_char\E/) { 
    print "SUCCESS\n"; 
} 
else { 
    print STDERR "ERROR: What happened?\n"; 
    print STDERR "ORIGINAL: \n$data\n"; 
    print STDERR "MODIFIED: \n$new_data\n"; 
} 

sub insertProgram { 
    my ($local_name, $local_task, $local_data) = @_; 

    # get program section from XML template 
    my $twig = new XML::Twig; 
    $twig->parse('<?xml version="1.0"?> 
<TemplateSet> 
    <PROGRAM>PROGRAM <Name>ProgramNameGoesHere</Name>() 
    END_PROGRAM</PROGRAM> 
    <TASK>TASK <Name>TaskNameGoesHere</Name>() 
    END_TASK</TASK> 
</TemplateSet> 
'); 
    my $program = $twig->root->first_child('PROGRAM'); 

    # replace program name in XML template 
    $program->first_child('Name')->set_text($local_name); 
    my $insert = $program->text(); 

    # stick modified program into data 
    if ($local_data =~ s/(\s+PROGRAM\s+[^\s]+\s+\()/\n\n $insert $1/) { 
     # found it and inserted new program 
    } 
    else { 
     # not found 
     return; 
    } 

    # add program name to task list 
    my $added_program_to_task = $FALSE; 
    my $found_start = $FALSE; 
    my $found_end = $FALSE; 
    my $new_data = ""; 
    # open string as a filehandle for line by line processing 
    my $filehandle; 
    open($filehandle, '<', \$local_data) 
     or die("Can't open string as a filehandle: $!"); 
    while (defined (my $line = <$filehandle>)) { 
     # look for start of our task 
     if ( 
       (!$found_start) && 
       ($line =~ m/\s+TASK\s+\Q$local_task\E\s+\(/) 
      ) { 
      # found the task! 
      $found_start = $TRUE; 
     } 

     # look for end of our task 
     if (
       ($found_start) && (!$found_end) && 
       ($line =~ m/\s+END_TASK/) 
      ) 
     { 
      # found the end tag for the task section! 
      $found_end = $TRUE; 

      # add the program name to the bottom of the list 
      $line = "  " . $local_name . ";\n" . $line; 
      $added_program_to_task = $TRUE; 
     } 

     # compile new data from processed line or original line 
     $new_data = $new_data . $line; 
    } 
    close($filehandle); 

    if ($added_program_to_task) { 
     # success 
    } 
    else { 
     # unable to find task 
     return; 
    } 

    return $new_data; 
} 

जब मैं इस स्क्रिप्ट को चलाने, मैं निम्नलिखित उत्पादन प्राप्त करें:

यहाँ एक स्क्रिप्ट है कि समस्या को दर्शाता है है संशोधित एम के तहत सीधे डेटा के सामने।

उत्तर

7

इसने चरित्र पर यूटीएफ -8 एन्कोडिंग रूपांतरण के लिए आईएसओ -885 9 -1 किया है: \xBF ->\xC2\xBF

एक्सएमएल :: ट्विग अपने सभी इनपुट को यूटीएफ -8 (see here) में परिवर्तित करता है।

आप keep_encoding विकल्प का उपयोग करके इनपुट एन्कोडिंग रखने के लिए ट्विग को बता सकते हैं (एक्सएमएल :: ट्विग एफएक्यू भी देखें: My XML documents/data are produced by tools that do not grok Unicode, will XML::Twig help me there?)।

लेकिन संभवतः यूटीएफ -8 को रखना बेहतर होगा, या शायद आप चुपचाप चरित्र को छोड़ दें, इस पर निर्भर करता है कि आप इसके साथ क्या करने जा रहे हैं।

+0

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

+0

उस स्थिति में 'keep_encoding' को नौकरी करना चाहिए। – mercator

1

मैं वास्तव में आपके कोड को समझ नहीं सकता हूं, यह अभी भी बहुत ही जटिल है, लेकिन शायद समस्या को बीओएम के साथ करना है (Unicode BOM FAQ देखें) जिसे एक्सएमएल की शुरुआत में अनदेखा किया जाएगा दस्तावेज़, लेकिन अगर आप इसे किसी दूसरे के बीच में कॉपी नहीं करते हैं? एक्सबीएफ मूल्य की वजह से यहां अनुमान लगाया जा रहा है, यह यूटीएफ -8 दस्तावेज़ के लिए बीओएम का हिस्सा है।

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

  • कोई संबंधित समस्या नहीं^_^