2012-04-04 13 views
8

टॉमसी जिस तरह से यूनिकोड वर्णों को रास्ते में विघटित करने की सिफारिश करता है, और रास्ते पर पुनः संकलन (http://www.perl.com/pub/2012/04/perl-unicode-cookbook-always-decompose-and-recompose.html)।आपको यूनिकोड (एनएफसी) को रास्ते में क्यों बदला जाना चाहिए?

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

क्या कोई अन्य स्पष्ट कारण हैं जो मुझे याद आ रही है?

उत्तर

5

जैसा कि वेनट्सु एक टिप्पणी में लिखते हैं, ऐसे सॉफ्टवेयर हैं जो रचनाकृत पात्रों को संभाल सकते हैं लेकिन विघटित वर्ण नहीं। हालांकि विपरीत सैद्धांतिक रूप से भी संभव है, मैंने इसे अभ्यास में कभी नहीं देखा है और यह दुर्लभ होने की उम्मीद है।

केवल एक विघटित चरित्र को प्रदर्शित करने के लिए, प्रतिपादन सॉफ़्टवेयर को डायक्रिटिक अंकों के संयोजन से निपटने की आवश्यकता है। फ़ॉन्ट में उन्हें खोजने के लिए पर्याप्त नहीं है। मूल चरित्र के आयामों के बारे में जानकारी का उपयोग करके, रेंडरर को डायक्रिटिक को सही ढंग से स्थापित करने की आवश्यकता होती है। इसके साथ अक्सर समस्याएं होती हैं, जिसके परिणामस्वरूप खराब प्रतिपादन होता है - विशेष रूप से यदि प्रतिपादन एक अलग फ़ॉन्ट से डायक्रिटिक का उपयोग करता है! परिणाम टाइपोग्राफर द्वारा डिज़ाइन किए गए "एई" जैसे प्रीकॉम्ज्ड कैरेक्टर के ग्लिफ को आसानी से प्रदर्शित करके हासिल किया जा सकता है।

(सॉफ्टवेयर प्रतिपादन भी स्थिति का विश्लेषण कर सकते हैं और प्रभावी ढंग से एक precomposed चरित्र को विघटित चरित्र को मैप करें। लेकिन उस अतिरिक्त कोड की आवश्यकता होगी।)

+0

यह उत्तर बहुत समझ में आता है – petersergeant

0

यह पाठ संपादकों की तरह चीजों को सरल बना देगा क्योंकि अंतिम उपयोगकर्ता एक दृश्य चरित्र को एक चरित्र होने की उम्मीद करेगा। यह उन प्रणालियों के साथ मुद्दों को भी रोकता है जो विघटित वर्णों को 'एकल' वर्णों के रूप में नहीं मानते हैं।

इसके अलावा, मुझे कोई विशेष लाभ नहीं दिख रहा है।

+3

मुझे यकीन नहीं है कि मैं इसके साथ सहमत हूं। यहां तक ​​कि एनएफसी में, कई ग्रैफेम्स हैं जो एक से अधिक चरित्र से बने होते हैं। कई "दृश्यमान चार + संयोजन चार" संयोजन हैं जिनके पास प्रीकंपोस्ड संस्करण नहीं है। –

+0

शायद। मुझे लगता है कि इसका मतलब यह भी है कि यदि आपका लैटिन -1 के रूप में गलत तरीके से पढ़ा गया है तो आपको अपना टेक्स्ट समझने की अधिक संभावना है। हालांकि, यह एक बड़ी जीत की तरह प्रतीत नहीं होता है। – petersergeant

+0

@petersergeant: नहीं यह काम नहीं करेगा। केवल अक्षरों 1-128 लैटिन -1 और यूटीएफ -8 में समान दिखते हैं। अक्षरों 12 9-256 में समान _value_ लेकिन अलग-अलग एन्कोडिंग हैं। जैसे 'é' का मूल्य 0xe9 है। लैटिन -1 में, यह भी इसके एन्कोडिंग है। यूटीएफ -8 में यह 0xc3a9 (दो बाइट्स) बन जाता है। यह सामान्य 'Ã ©' एन्कोडिंग त्रुटियों को बताता है जो आप देखते हैं। http://en.wikipedia.org/wiki/Utf8 में विवरण हैं। –

2

यह काफी आसान है: अधिकांश उपकरणों में यूनिकोड समर्थन सीमित है; वे मानते हैं कि पात्र एनएफसी फॉर्म में हैं।

उदाहरण के लिए, यह आम तौर पर है कि कैसे लोगों तार तुलना:

perl -CSDA -e"use utf8; if ($ARGV[0] eq "Éric") { ... }" 

और निश्चित रूप से, 'ई' एनएफसी रूप में है (के बाद से है कि क्या लगभग सब कुछ पैदा करता है), तो यह कार्यक्रम केवल में तर्क स्वीकार करता है एनएफसी फॉर्म

+1

क्या यह वाकई सच है या आंत महसूस कर रहा है? अगर कोई सर्वेक्षण है तो मैं उत्सुक हूं। –

+0

@brian d foy, मैंने पर्लमोन्क्स पर देखे गए लाखों स्निपेट में, मैंने (लगभग?) कभी भी किसी को भी एनएफसी या एनएफडी का उपयोग नहीं देखा है, फिर भी मैंने बहुत सारे 'eq' और 'm //' को देखा है। और मैंने कभी भी एनएफडी फॉर्म में कभी भी कुछ नहीं देखा है। – ikegami

+0

@brian d foy, मुझे इस पर सवाल क्यों करें और एक ही स्पष्टीकरण (केवल अधिक obfuscated) बनाने के लिए आगे बढ़ें? मानकीकरण केवल तभी जरूरी है जब लोग एनएफसी या एनएफडी के माध्यम से अपना इनपुट पास न करें, इसलिए आपकी खुद की पोस्ट आपके प्रश्न का उत्तर है। – ikegami

-3

टॉम क्रिश्चियन्सेन StackOverflow पर एक सक्रिय भागीदार है और पर्ल ढेर सारे प्रश्न का उत्तर देता । एक अच्छा मौका है कि वह इस सवाल का जवाब देगा।

ऐसे ff के रूप में कुछ चरित्र दृश्यों या तो दो यूनिकोड वर्ण f और f, या एक ही यूनिकोड वर्ण (ff) के रूप में के रूप में UTF-8 में दर्शाया जा सकता है। जब आप अपने पात्रों को विघटित करते हैं, तो आप ff जैसी चीजें बना रहे हैं जो दो अलग-अलग वर्ण बन जाते हैं जो सॉर्टिंग के लिए महत्वपूर्ण होंगे। जब आप सॉर्ट करते हैं तो आप इसे दो अलग-अलग अक्षर f बनना चाहते हैं।

जब आप को संयोजित UTF-8 f और f, वे एक UTF-8 वर्ण जो (आप उन्हें अच्छी तरह से स्वरूपित करना चाहते हैं) प्रदर्शित करने के लिए और संपादन के लिए महत्वपूर्ण होगा के लिए वापस जाओ (आप एक ही रूप में यह संपादित करना चाहते हैं चरित्र)।

दुर्भाग्य से, मेरा सिद्धांत स्पैनिश की तरह चीजों से अलग हो जाता है।इसे यू +00 एफ 1 के रूप में एक वर्ण के रूप में दर्शाया गया है, और यू +006 ई (एन) और यू +0303 (जगह में ~) में विघटित होता है। हो सकता है कि पर्ल के पास इस प्रकार के दो यूटीएफ -8 विघटन चरित्र प्रतिनिधित्व को संभालने के लिए बनाया गया तर्क है।

+4

ऐसा नहीं है कि वे एक "यूटीएफ -8 वर्ण" पर वापस जाते हैं, लेकिन वे एक कोड बिंदु पर लिखते हैं जिसे आप एन्कोड करते हैं। एन्कोडिंग कोई फर्क नहीं पड़ता। –

+3

क्षमा करें, लेकिन यह गलत है। 'perl -MUnicode :: Normalize -E" $ _ = chr (0xFB00); लंबाई $ _ कहें; लंबाई एनएफडी $ _ कहें; "आउटपुट दोनों के लिए एक है। "एफएफ" "एफ" + "एफ" को विघटित नहीं करता है। (एनकेएफडी करता है, लेकिन यह कुछ और है।) इसी तरह, "एफ" + "एफ" कभी भी "एफएफ" के लिए तैयार नहीं होगा। वे बस बराबर नहीं हैं। – ikegami

0

आपको एक सामान्यीकरण फ़ॉर्म होना चाहिए ताकि सभी डेटा समान सामान्यीकरण हो, तो संभावित रूप से कम से कम क्यों नहीं चुनें?

किसी और के अपघटन के लिए, याद रखें कि आप जो उत्पादन करते हैं उसके साथ सख्त होना चाहते हैं लेकिन जो भी आप स्वीकार करते हैं उसके साथ उदार होना चाहते हैं। :)

+0

वैसे वह स्पष्ट रूप से एक से चिपके रहने के बजाए दोनों रूपों का उपयोग करने का सुझाव दे रहा है। – petersergeant

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

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