2012-03-27 12 views
8

मैं iconv लाइब्रेरी का उपयोग एक आधुनिक इनपुट स्रोत लीगेसी सिस्टम लेटिन 1 का उपयोग करता है करने के लिए UTF-8 का उपयोग करता है से इंटरफेस करने के रूप विघटित नहीं, उर्फ सीपी 1252 (आईएसओ -885 9 -1 के सुपरसेट)।iconv precomposed प्रपत्र क्यों परिवर्तित कर सकते हैं लेकिन 'ई' (UTF-8 से CP1252 के लिए)

इंटरफ़ेस हाल ही में फ्रांसीसी स्ट्रिंग "एडिशन" को बदलने में विफल रहा, जहां "É" को हेक्स 45 CC 81 के रूप में एन्कोड किया गया था। ध्यान दें कि गंतव्य एन्कोडिंग में "É" वर्ण होता है, जिसे C9 के रूप में एन्कोड किया गया है।

आइकनव "ए" को परिवर्तित करने में विफल क्यों होता है? मैंने जांच की है कि MacOS X 10.7.3 के साथ उपलब्ध iconv कमांड लाइन उपकरण का कहना है कि यह परिवर्तित नहीं हो सकता है, और PERL iconv मॉड्यूल भी विफल रहता है।

यह सब और अधिक परेशान है कि "É" वर्ण का पूर्वकल्पित रूप (C3 89 के रूप में एन्कोड किया गया) बस ठीक हो जाता है।

इस iconv साथ एक बग है या मैं कुछ याद किया?

ध्यान दें कि अगर मैं यूटीएफ -16 से कनवर्ट करने का प्रयास करता हूं तो भी मुझे एक ही समस्या है (जहां "ए" को 00 C9 के रूप में एन्कोड किया गया है या 00 45 03 01 विघटित)।

उत्तर

5

दुर्भाग्य iconv वास्तव में, UTF-8 में विघटित पात्रों के साथ सौदा नहीं करता है संस्करण मैक ओएस एक्स पर स्थापित छोड़कर

जब मैक फ़ाइल नाम के साथ काम, आप "utf8- साथ iconv उपयोग कर सकते हैं मैक "चरित्र सेट विकल्प। यह कुछ idiosyncrasies of the Mac decomposed form खाते में भी ध्यान देता है।

हालांकि, iconv या libiconv के गैर मैक संस्करण इस का समर्थन नहीं करते, और मैं मैक जो इस सहायता प्रदान पर इस्तेमाल किया सूत्रों नहीं पा सके।

मैं आपसे सहमत हूं कि आइकनव यूटीएफ 8 के एनएफसी और एनएफडी फॉर्मों से निपटने में सक्षम होना चाहिए, लेकिन जब तक कोई स्रोतों को पैच नहीं करता है तो हमें इसे मैन्युअल रूप से पहचानना होगा और आइकनव को सामान पास करने से पहले इसका सामना करना होगा।

इस कष्टप्रद समस्या का सामना कर रहा के रूप में जुक्का ने सुझाव दिया पर्ल के यूनिकोड :: मॉड्यूल सामान्यीकृत करें इस्तेमाल किया।

#!/usr/bin/perl 

use Encode qw/decode_utf8 encode_utf8/; 
use Unicode::Normalize; 

while (<>) { 
    print encode_utf8(NFC(decode_utf8 $_)); 
} 
0

एक normalizer (इस मामले में, सामान्यीकरण प्रपत्र सेल्सियस के लिए) का प्रयोग करें iconv कॉल करने से पहले।

एक प्रोग्राम जो चरित्र एन्कोडिंग (वर्णों के अलग-अलग प्रतिनिधित्व या अधिक सटीक, कोड बिंदु, बाइट्स के अनुक्रम के रूप में) से संबंधित है और उनके बीच परिवर्तित होने से पूर्वकल्पित और रचनाकृत रूपों को अलग-अलग व्यवहार करने की अपेक्षा की जानी चाहिए। विघटित ई दो कोड बिंदु है और पूर्वकल्पित ई से अलग है, जो एक कोड बिंदु है।

+1

धन्यवाद। यह सवाल का जवाब नहीं देता है कि iconv गंतव्य एन्कोडिंग में प्रीकॉम्ज्ड कैरेक्टर को मैप क्यों करता है, लेकिन (स्वीकार्य रूप से अलग) विघटित चरित्र नहीं। क्यों न दोनों? पूर्व के बजाय उत्तरार्द्ध क्यों नहीं? रूपांतरण टूल/लाइब्रेरी के लिए, यह एक विफलता है, अगर कोई बग नहीं है। –

+0

@ जीन-डेनिस मुइस, क्योंकि प्रीकंपोज़ड फॉर्म एक यूनिकोड चरित्र है, जो मैपिंग टेबल के अनुसार लक्ष्य एन्कोडिंग में प्रतिनिधित्व करने योग्य है, जबकि विघटित रूप दो यूनिकोड वर्ण हैं, और बाद वाला विंडोज -1252 (सीपी 1252) में प्रतिनिधित्व योग्य नहीं है। । इन रूपों के बीच पत्राचार चरित्र एन्कोडिंग के स्तर पर मौजूद नहीं है; यह एक उच्च स्तरीय प्रोटोकॉल मुद्दा है (और यह एक विशिष्ट प्रकार का एक समानता है, पहचान नहीं)। –

+1

आप वास्तव में गलत हैं। एक विकृत चरित्र को अपने सीपी -1252 समकक्ष में मैप करने का कोई कारण नहीं है।चाहे "ए" एक प्रतिनिधित्व या दूसरे का उपयोग कर रहा हो, यह सीपी -1252 "ई" चरित्र में मैप किया जा सकता है - और चाहिए। –

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