2011-12-07 13 views
12

मैं यहां डेवेल :: पीक :: डंप दो अलग-अलग परिणामों के साथ क्यों मिलता हूं?हैश कुंजी एन्कोडिंग: मैं यहां डेवेल :: पीक :: डंप दो अलग-अलग परिणामों के साथ क्यों मिलता हूं?

#!/usr/bin/env perl 
use warnings; 
use 5.014; 
use utf8; 
binmode STDOUT, ':encoding(utf-8)'; 
use Devel::Peek; 

my %hash1 = ('müller' => 1); 
say Dump $_ for keys %hash1; 

my %hash2; 
$hash2{'müller'} = 1; 
say Dump $_ for keys %hash2; 

आउटपुट:

SV = PV(0x753270) at 0x76d230 
    REFCNT = 2 
    FLAGS = (POK,pPOK,UTF8) 
    PV = 0x759750 "m\303\274ller"\0 [UTF8 "m\x{fc}ller"] 
    CUR = 7 
    LEN = 8 

SV = PV(0x753270) at 0x7d75a8 
    REFCNT = 2 
    FLAGS = (POK,FAKE,READONLY,pPOK) 
    PV = 0x799110 "m\374ller" 
    CUR = 6 
    LEN = 0 
+0

क्या आप निश्चित हैं कि आपके पास दोनों कुंजीों के लिए सटीक बाइट्स हैं? – Mat

+0

दोनों 'ü' कुंजीबोड से 'ü' कुंजी के साथ लिखा गया है। –

+0

बीटीडब्ल्यू, 'डंप कहें ...;' होना चाहिए 'डंप ...; '। – ikegami

उत्तर

4

उन scalars दोनों बिल्कुल एक ही स्ट्रिंग होते हैं। केवल अंतर ही है कि स्ट्रिंग को आंतरिक रूप से कैसे संग्रहीत किया जाता है।

मेरा अनुमान है कि हैश में कुंजी का पता लगाने की कोशिश करते समय तुलना को आसान बनाने के लिए कुंजी सामान्यीकृत होती है।

+0

मैंने एक हैश से' XML :: LibXML' के साथ 'xml' फ़ाइल लिखने का प्रयास किया। जब मैं 'हैश {कुंजी} में हैश-प्रविष्टियां लिखता हूं ... 'मोड में मुझे त्रुटि संदेश मिलते हैं और स्क्रिप्ट मर जाती है: <त्रुटि: स्ट्रिंग यूटीएफ -8 एन्कोडिंग त्रुटि में नहीं है: आउटपुट रूपांतरण विफल होने के कारण विफल त्रुटि, तो बाइट्स 0xFC 0x6C 0x6C 0x65 I/O त्रुटि: एनकोडर त्रुटि <लेखक लेखक = "मीटर> –

+0

@sid_com , यह नया प्रश्न पूछने का स्थान नहीं है, और आपका प्रश्न बेहद अस्पष्ट है। कृपया इसे उचित स्थान पर पोस्ट करें, और समस्या का एक न्यूनतम, रननीय प्रदर्शन प्रदान करें। – ikegami

+0

एक नया प्रश्न खोल दिया: http://stackoverflow.com/प्रश्न/8443863/हो रही-एन्कोडिंग-त्रुटि-जब-उपयोग-हैश-कुंजी-टू-राइट-xml-files-with-xmllibxml –

1

यह कोई जवाब नहीं है, मेरा मानना ​​है कि ikegami प्रतिक्रिया सही है। मैं बस कुछ कोड के साथ कुछ अवलोकन जोड़ना चाहता था।

मैंने निम्नलिखित कोड 5.10 से 5.15 के माध्यम से चलाया और व्यवहार सुसंगत है।

use utf8; 
use Test::More; 

{ 
    my %h = ('müller' => 1); 
    my $k = (keys %h)[0]; 
    ok(utf8::is_utf8($k), 'UTF-8 Latin-1 hash key has SvUTF8 set'); 
} 

{ 
    my %h = ('müller' => 1); 
     $h{'müller'} = 2; 
    my $k = (keys %h)[0]; 
    ok(! utf8::is_utf8($k), 'UTF-8 Latin-1 hash key does not has SvUTF8 set after assignment'); 
} 

{ 
    my %h = ('☺' => 1); 
     $h{'☺'} = 2; 
    my $k = (keys %h)[0]; 
    ok(utf8::is_utf8($k), 'UTF-8 (> Latin-1) hash key has SvUTF8 set after assignment'); 
} 

done_testing; 

यदि दूसरा परीक्षण अपेक्षित है, तो यह पहला मौन डाउनग्रेड होगा जिसे मैं जानता हूं। मुझे लगता है कि पी 5 पी का अंतिम जवाब है या नहीं, यह अनुकूलन बग या अपेक्षित व्यवहार है या नहीं। (sv_dump एक अनुकूलन की तरह दिखता है (पीओके, नकली, रीडोनली, पीपीओके))