आधुनिक पर्ल डिफ़ॉल्ट रूप से UTF-8 से क्यों बचता है?


557

मुझे आश्चर्य है कि पर्ल द्वारा उपयोग किए गए अधिकांश आधुनिक समाधान डिफ़ॉल्ट रूप से UTF-8 को सक्षम नहीं करते हैं ।

मैं समझता हूं कि कोर पर्ल स्क्रिप्ट्स के लिए कई विरासत समस्याएं हैं, जहां यह चीजों को तोड़ सकती है। लेकिन, मेरे दृष्टिकोण से, 21 वीं सदी में, बड़ी नई परियोजनाओं (या बड़े परिप्रेक्ष्य के साथ परियोजनाएं) को अपने सॉफ्टवेयर को UTF-8 को खरोंच से प्रमाण बनाना चाहिए। फिर भी मैं इसे होते हुए नहीं देखता। उदाहरण के लिए, मूस सख्त और चेतावनी को सक्षम करता है, लेकिन यूनिकोड नहीं । आधुनिक :: पर्ल बॉयलरप्लेट को भी कम करता है, लेकिन कोई UTF-8 हैंडलिंग नहीं है।

क्यों? वर्ष 2011 में आधुनिक पर्ल परियोजनाओं में UTF-8 से बचने के लिए कुछ कारण हैं?


@Tchrist की टिप्पणी बहुत लंबी हो गई, इसलिए मैं इसे यहां जोड़ रहा हूं।

ऐसा लगता है कि मैंने खुद को स्पष्ट नहीं किया। कुछ चीजों को जोड़ने की कोशिश करता हूं।

tchrist और मैं स्थिति को समान रूप से देखते हैं, लेकिन हमारे निष्कर्ष पूरी तरह से विपरीत छोर पर हैं। मैं सहमत हूं, यूनिकोड के साथ स्थिति जटिल है, लेकिन यही कारण है कि हमें (पर्ल उपयोगकर्ताओं और कोडर्स) को कुछ परत (या व्यावहारिक) की आवश्यकता होती है जो आजकल यूटीएफ -8 को संभालना आसान बनाता है क्योंकि यह आजकल होना चाहिए।

tchrist ने कवर करने के लिए कई पहलुओं की ओर इशारा किया, मैं उनके बारे में दिनों या हफ्तों तक पढ़ूंगा और सोचूंगा । फिर भी, यह मेरी बात नहीं है। tchrist यह साबित करने की कोशिश करता है कि "UTF-8 को सक्षम करने का कोई एक तरीका नहीं है"। मुझे उससे बहस करने का इतना ज्ञान नहीं है। इसलिए, मैं जीवंत उदाहरणों पर टिकता हूं।

मैं राडोडो और यूटीएफ -8 के साथ खेलता रहा, जैसा कि मुझे चाहिए था । मुझे कोई परेशानी नहीं हुई, बस काम किया। हो सकता है कि कुछ सीमाएँ कहीं गहरी हों, लेकिन शुरू में, मैंने जो भी परीक्षण किया, वह मेरी अपेक्षा के अनुरूप काम किया।

आधुनिक पर्ल 5 में भी एक लक्ष्य नहीं होना चाहिए? मैं इसे और अधिक तनाव देता हूं: मैं यूटीएफ -8 का सुझाव नहीं दे रहा हूं क्योंकि कोर पर्ल के लिए डिफ़ॉल्ट चरित्र सेट है, मैं उन लोगों के लिए इसे स्नैप के साथ ट्रिगर करने की संभावना का सुझाव देता हूं जो नई परियोजनाओं को विकसित करते हैं।

एक और उदाहरण, लेकिन अधिक नकारात्मक स्वर के साथ। चौखटे विकास को आसान बनाना चाहिए। कुछ साल पहले, मैंने वेब फ्रेमवर्क की कोशिश की, लेकिन सिर्फ उन्हें फेंक दिया क्योंकि "UTF-8 को सक्षम करना" इतना अस्पष्ट था। मुझे नहीं मिला कि यूनिकोड समर्थन को कैसे और कहां से जोड़ा जाए। यह इतना समय लेने वाला था कि मुझे पुराने रास्ते पर जाना आसान लगा। अब मैंने देखा कि मेसन 2 के साथ एक ही समस्या से निपटने के लिए एक इनाम था : मेसन 2 UTF-8 को कैसे साफ करें? । तो, यह बहुत नया ढांचा है, लेकिन UTF-8 के साथ इसका उपयोग करने से इसके आंतरिक ज्ञान की गहरी जानकारी की आवश्यकता है। यह एक बड़े लाल चिन्ह की तरह है: STOP, मेरा उपयोग न करें!

मैं वास्तव में पर्ल को पसंद करता हूं। लेकिन यूनिकोड के साथ काम करना दर्दनाक है। मैं अब भी खुद को दीवारों के खिलाफ दौड़ता हुआ पाता हूं। किसी तरह से tchrist सही है और मेरे सवालों का जवाब देता है: नई परियोजनाएं UTF-8 को आकर्षित नहीं करती हैं क्योंकि यह पर्ल 5 में बहुत जटिल है।


15
मुझे खेद है लेकिन मैं @tchrist से सहमत हूं - UTF-8 बेहद कठिन है। ऐसा कोई ढांचा या उपकरण नहीं है जो सिर्फ "एक स्विच फ़्लिप" करता है और फिर इसे सही ढंग से संभालता है। यह ऐसा कुछ है जिसके बारे में आपको सीधे सोचना पड़ता है जब आप अपने आवेदन को डिजाइन करते हैं - न कि किसी तरह की रूपरेखा या भाषा आपके लिए संभाल सकती है। यदि रैकोडो सिर्फ आपके लिए काम करने के लिए हुआ, तो आप अपने परीक्षण मामलों के साथ पर्याप्त रूप से साहसी नहीं थे - क्योंकि यह @ tchrist के उत्तर और कसाई में कई उदाहरण ले जाएगा।
बिली ओनली

12
वास्तव में आप मोसे या आधुनिक :: पर्ल क्या उम्मीद कर रहे हैं? जादुई फ़ाइलों और डेटाबेस में बेतरतीब ढंग से एनकोड चरित्र डेटा को फिर से वैध डेटा में बनाते हैं?
जॉकवे

13
इसका क्या मतलब है? मूस का पाठ के हेरफेर से कोई लेना-देना नहीं है। यह चरित्र एन्कोडिंग के बारे में क्यों पता होना चाहिए, बहुत कम आपके लिए एक डिफ़ॉल्ट का चयन करता है? (वैसे भी, आप जिस सूची को सूचीबद्ध करते हैं, उसके कारण एन्कोडिंग को स्पर्श नहीं करते हैं, क्योंकि कन्वेंशन पर्ल व्यवहार के लिए शाब्दिक व्यवहार को प्रभावित करने के लिए है। यह मानते हुए कि एंटायर वर्ल्ड, अन्य मॉड्यूल शामिल हैं, UTF-8 बस गलत बात है। । यह PHP या रूबी यहाँ नहीं है।)
jrockway

8
(इसके अलावा, "सबसे आधुनिक पर्ल ऐप्स" UTF-8 पर टूटते हैं! मैंने निश्चित रूप से कभी भी एक आवेदन नहीं लिखा है, पर्ल या अन्यथा, यह यूनिकोड-क्लीन नहीं है।)
jrockway

11
नायब। tchrist (टॉम क्रिश्चियनन) ने यूनिकोड के बारे में अपने [ ट्रेनिंग .perl.com/OSCON2011/index.html टॉम क्रिश्चियन की सामग्री OSCON 2011 के लिए] पोस्ट की। एक शीर्षक "यूनिकोड सपोर्ट शूटआउट: द गुड, द बैड, एंड (ज्यादातर) अग्ली" यूनिकोड समर्थन के बारे में विभिन्न प्रोग्रामिंग भाषाओं में बात करता है। केवल Google Go और Perl5 के पास पूर्ण यूनिकोड के लिए समर्थन है, केवल Google Go अंतर्निहित (Perl6 का कोई उल्लेख नहीं)।
जकुब नारबस्की

जवाबों:


1146

𝟕 𝟕 : 𝟕 𝟕 𝟕

  1. PERL_UNICODEकरने के लिए अपने envariable सेट करें AS। यह सभी पर्ल स्क्रिप्ट @ARGVको UTF ings 8 स्ट्रिंग्स के रूप में डीकोड करता है, और स्टड, स्टडआउट, और stderr के सभी तीनों को UTF। 8 की एन्कोडिंग सेट करता है। ये दोनों वैश्विक प्रभाव हैं, शाब्दिक नहीं।

  2. आपकी स्रोत फ़ाइल (प्रोग्राम, मॉड्यूल, लाइब्रेरी, doहिक्की) के शीर्ष पर, प्रमुखता से दावा किया जाता है कि आप पर्ल संस्करण 5.12 या बेहतर के माध्यम से चला रहे हैं:

    use v5.12;  # minimal for unicode string feature
    use v5.14;  # optimal for unicode string feature
    
  3. चेतावनियों को सक्षम करें, क्योंकि पिछली घोषणा केवल चेतावनियों और विशेषताओं को सक्षम करती है, चेतावनियों को नहीं। मैं अपवादों में यूनिकोड चेतावनियों को बढ़ावा देने का भी सुझाव देता हूं, इसलिए इन दोनों पंक्तियों का उपयोग करें, न कि उनमें से केवल एक का। नोट हालांकि v5.14 के तहत, कि utf8चेतावनी वर्ग तीन अन्य subwarnings जो सभी अलग से सक्रिय किया जा सकता शामिल हैं: nonchar, surrogate, और non_unicode। आप इन पर अधिक नियंत्रण लगाने की इच्छा कर सकते हैं।

    use warnings;
    use warnings qw( FATAL utf8 );
    
  4. घोषणा करें कि यह स्रोत इकाई UTF। 8 के रूप में एन्कोडेड है। हालाँकि एक बार इस प्राग्मा ने अन्य काम किए, अब यह इस अकेले उद्देश्य को पूरा करता है और कोई दूसरा नहीं:

    use utf8;
  5. इस बात की घोषणा करें कि इस शाब्दिक दायरे के भीतर एक फ़ाइलहैंडल खोलने वाली कोई भी चीज़ नहीं बल्कि कहीं और यह मान लेना है कि यह धारा UTF unless 8 में एनकोडेड है जब तक कि आप इसे अन्यथा नहीं बताते। इस तरह से आप अन्य मॉड्यूल या अन्य प्रोग्राम के कोड को प्रभावित नहीं करते हैं।

    use open qw( :encoding(UTF-8) :std );
  6. के माध्यम से नामित वर्ण सक्षम करें \N{CHARNAME}

    use charnames qw( :full :short );
  7. यदि आपके पास एक DATAहैंडल है, तो आपको इसकी एन्कोडिंग को स्पष्ट रूप से सेट करना होगा। यदि आप चाहते हैं कि यह UTF, 8 हो, तो कहें:

    binmode(DATA, ":encoding(UTF-8)");

अन्य मामलों का कोई अंत नहीं है, जिसके साथ आप अंततः अपने आप को चिंतित पा सकते हैं, लेकिन ये राज्य के लक्ष्य को "यूटीएफ” 8 के साथ काम करने के लिए सब कुछ बनाने "के लिए पर्याप्त होगा, उन शर्तों के कुछ कमजोर अर्थों के लिए।

एक अन्य व्यावहारिक, हालांकि यह यूनिकोड से संबंधित नहीं है, यह है:

      use autodie;

यह दृढ़ता से अनुशंसित है।

🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞


𝕭𝖔𝖎𝖑𝖊𝖗⸗𝖕𝖑𝖆𝖙𝖊 𝕮𝖔𝖉𝖊 🎁 𝕭𝖔𝖎𝖑𝖊𝖗⸗𝖕𝖑𝖆𝖙𝖊 𝕭𝖔𝖎𝖑𝖊𝖗⸗𝖕𝖑𝖆𝖙𝖊 𝕭𝖔𝖎𝖑𝖊𝖗⸗𝖕𝖑𝖆𝖙𝖊 𝕭𝖔𝖎𝖑𝖊𝖗⸗𝖕𝖑𝖆𝖙𝖊 𝕭𝖔𝖎𝖑𝖊𝖗⸗𝖕𝖑𝖆𝖙𝖊


मेरी अपनी बॉइलरप्लेट इन दिनों ऐसी दिखती है:

use 5.014;

use utf8;
use strict;
use autodie;
use warnings; 
use warnings    qw< FATAL  utf8     >;
use open        qw< :std  :utf8     >;
use charnames   qw< :full >;
use feature     qw< unicode_strings >;

use File::Basename      qw< basename >;
use Carp                qw< carp croak confess cluck >;
use Encode              qw< encode decode >;
use Unicode::Normalize  qw< NFD NFC >;

END { close STDOUT }

if (grep /\P{ASCII}/ => @ARGV) { 
   @ARGV = map { decode("UTF-8", $_) } @ARGV;
}

$0 = basename($0);  # shorter messages
$| = 1;

binmode(DATA, ":utf8");

# give a full stack dump on any untrapped exceptions
local $SIG{__DIE__} = sub {
    confess "Uncaught exception: @_" unless $^S;
};

# now promote run-time warnings into stack-dumped
#   exceptions *unless* we're in an try block, in
#   which case just cluck the stack dump instead
local $SIG{__WARN__} = sub {
    if ($^S) { cluck   "Trapped warning: @_" } 
    else     { confess "Deadly warning: @_"  }
};

while (<>)  {
    chomp;
    $_ = NFD($_);
    ...
} continue {
    say NFC($_);
}

__END__

𝖔 𝖔 𝖔 𝖔 𝖔 𝖔 𝖔 𝖔 𝖔 𝖔 𝖔 𝖔 𝖔 𝖔


यह कहते हुए कि "पर्ल को किसी तरह [चाहिए] ! ] यूनिकोड को डिफ़ॉल्ट रूप से सक्षम करें "भी कुछ दुर्लभ और अलग-थलग मामले में मामूली रूप से उपयोगी होने के लिए पर्याप्त कहने के लिए सोचने के लिए शुरू नहीं करता है। यूनिकोड सिर्फ एक बड़े चरित्र प्रदर्शनों की तुलना में बहुत अधिक है; यह भी है कि कैसे उन पात्रों को सभी कई, कई मायनों में बातचीत करते हैं।

यहां तक ​​कि साधारण-से-न्यूनतम न्यूनतम उपाय जो (कुछ) लोगों को लगता है कि वे चाहते हैं कि वे लाखों कोड की कोड को बुरी तरह से तोड़ने की गारंटी दें, कोड जिसे आपकी नई नई बहादुर नई विश्व आधुनिकता के लिए "अपग्रेड" करने का कोई मौका नहीं है ।

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

Ode यूनिकोड को आसान बनाने के लिए अपने रास्ते से हट जाता है, जितना मैंने कभी इस्तेमाल किया है उससे कहीं अधिक। यदि आपको लगता है कि यह बुरा है, तो कुछ समय के लिए कुछ और प्रयास करें। फिर come पर वापस आएं: या तो आप एक बेहतर दुनिया में लौट आएंगे, या फिर आप अपने साथ उसी का ज्ञान लाएंगे ताकि हम आपके नए ज्ञान का उपयोग इन चीजों में बेहतर करने के लिए कर सकें।


𝖋𝖔𝖗 𝖋𝖔𝖗 𝖋𝖔𝖗 𝖋𝖔𝖗 𝖋𝖔𝖗 𝖋𝖔𝖗 𝖋𝖔𝖗 𝖋𝖔𝖗 𝖋𝖔𝖗 𝖋𝖔𝖗 𝖋𝖔𝖗


कम से कम, यहां कुछ चीजें हैं जो ”डिफ़ॉल्ट रूप से यूनिकोड को सक्षम करने’ के लिए आवश्यक प्रतीत होती हैं, जैसा कि आपने इसे रखा है:

  1. डिफ़ॉल्ट रूप से सभी 🐪 स्रोत कोड UTF-8 में होना चाहिए। आप उस के साथ use utf8या प्राप्त कर सकते हैं export PERL5OPTS=-Mutf8

  2. The DATAहैंडल UTF-8 होना चाहिए। आपको इसे प्रति-पैकेज के आधार पर करना होगा, जैसे कि binmode(DATA, ":encoding(UTF-8)")

  3. Should स्क्रिप्ट के लिए प्रोग्राम तर्क को डिफ़ॉल्ट रूप से UTF-8 समझा जाना चाहिए। export PERL_UNICODE=A, या perl -CA, या export PERL5OPTS=-CA

  4. मानक इनपुट, आउटपुट और त्रुटि स्ट्रीम UTF-8 के लिए डिफ़ॉल्ट होनी चाहिए। export PERL_UNICODE=Sउन सभी के लिए, या I, Oऔर / या Eउनमें से कुछ के लिए। यह जैसा है perl -CS

  5. -द्वारा खोले गए किसी भी अन्य हैंडल को UTF-8 माना जाना चाहिए जब तक कि अन्यथा घोषित न किया जाए; export PERL_UNICODE=Dया के साथ iऔर oइनमें से विशेष लोगों के लिए; export PERL5OPTS=-CDकाम करेगा। जो -CSADउन सभी के लिए बनाता है।

  6. दोनों आधारों को कवर करें export PERL5OPTS=-Mopen=:utf8,:stdअनोखा देखें ।

  7. आप UTF-8 एन्कोडिंग त्रुटियों को याद नहीं करना चाहते हैं। कोशिश करो export PERL5OPTS=-Mwarnings=FATAL,utf8। और सुनिश्चित करें कि आपके इनपुट स्ट्रीम हमेशा binmodeडी के लिए हैं :encoding(UTF-8), न कि केवल करने के लिए :utf8

  8. 128-255 के बीच कोड बिंदुओं को ode इसी यूनिकोड कोड पॉइंट के रूप में समझा जाना चाहिए, न कि केवल असुरक्षित बाइनरी मान। use feature "unicode_strings"या export PERL5OPTS=-Mfeature=unicode_strings। वह बनाएगा uc("\xDF") eq "SS"और "\xE9" =~ /\w/। एक साधारण export PERL5OPTS=-Mv5.12या बेहतर भी मिलेगा।

  9. नामांकित यूनिकोड वर्ण डिफ़ॉल्ट रूप से सक्षम नहीं हैं, इसलिए export PERL5OPTS=-Mcharnames=:full,:short,latin,greekकुछ या ऐसा जोड़ें । बिन बुलाए और tcgrep देखें ।

  10. आपको लगभग हमेशा मानक Unicode::Normalizeमॉड्यूल से विभिन्न प्रकार के डिकम्पोजिशन के कार्यों तक पहुंच की आवश्यकता होती है। export PERL5OPTS=-MUnicode::Normalize=NFD,NFKD,NFC,NFKD, और फिर हमेशा एनएफडी और एनएफसी से आउटबाउंड सामान के माध्यम से आने वाले सामान को चलाते हैं। इन के लिए कोई I / O लेयर नहीं है, जिससे मैं परिचित हूं, लेकिन nfc , nfd , nfkd , और nfkc देखें

  11. में 🐪 स्ट्रिंग तुलना का उपयोग कर eq, ne, lc, cmp, sort, और सी और सीसी हमेशा गलत हैं। तो इसके बजाय @a = sort @b, आप की जरूरत है @a = Unicode::Collate->new->sort(@b)। के रूप में अच्छी तरह से अपने को जोड़ सकते हैं export PERL5OPTS=-MUnicode::Collate। आप बाइनरी तुलना के लिए कुंजी को कैश कर सकते हैं।

  12. 🐪 बिल्ट-इन की तरह printfऔर writeयूनिकोड डेटा के साथ गलत काम करते हैं। आप उपयोग करने की आवश्यकता मॉड्यूल पूर्व के लिए, और दोनों कि और भी मॉड्यूल बाद के लिए और साथ ही। देखें UWC और unifmtUnicode::GCStringUnicode::LineBreak

  13. आप उन्हें पूर्णांक के रूप में गिनती करने के लिए चाहते हैं, तो आप अपने को चलाने के लिए है करने के लिए जा रहे हैं \d+के माध्यम से कैप्चर समारोह क्योंकि 🐪 निर्मित atoi (3) वर्तमान में चतुर पर्याप्त नहीं है।Unicode::UCD::num

  14. आपके पास going filesystems पर फ़ाइल सिस्टम समस्याओं के लिए जा रहे हैं। कुछ फाइल सिस्टम चुपचाप एनएफसी में रूपांतरण लागू करते हैं; अन्य चुपचाप NFD में रूपांतरण लागू करते हैं। और अन्य कुछ और अभी भी करते हैं। कुछ लोग मामले को पूरी तरह से नजरअंदाज कर देते हैं, जिससे समस्या और भी बढ़ जाती है। तो आपको अपने NFC / NFD को संभाल कर रखना होगा।

  15. सभी अपने 🐪 कोड को शामिल a-zया A-Zऔर इस तरह के MUST बदला जा , सहित m//, s///और tr///। यह चिल्लाते हुए लाल झंडे के रूप में खड़ा होना चाहिए कि आपका कोड टूट गया है। लेकिन यह स्पष्ट नहीं है कि इसे कैसे बदलना चाहिए। सही गुणों को प्राप्त करना, और उनके मामले को समझना, जितना आप सोच सकते हैं उससे अधिक कठिन है। मैं हर एक दिन में यूनीचर्स और यूनिप्रॉप्स का इस्तेमाल करता हूं

  16. उपयोग करने वाला कोड \p{Lu}लगभग उतना ही गलत है जितना कि उपयोग करने वाला कोड [A-Za-z]। आपको \p{Upper}इसके बजाय उपयोग करने की आवश्यकता है , और इसका कारण जानिए। हाँ, \p{Lowercase}और \p{Lower}से अलग हैं \p{Ll}और \p{Lowercase_Letter}

  17. कोड जो उपयोग करता है [a-zA-Z]वह और भी खराब है। और यह उपयोग नहीं कर सकता है \pLया \p{Letter}; इसका उपयोग करने की आवश्यकता है \p{Alphabetic}। सभी वर्णमालाएं अक्षर नहीं हैं, आप जानते हैं!

  18. यदि आप के साथ looking चर की तलाश कर रहे हैं /[\$\@\%]\w+/, तो आपको एक समस्या है। आपको देखने की आवश्यकता है /[\$\@\%]\p{IDS}\p{IDC}*/, और यहां तक ​​कि विराम चिह्न चर या पैकेज चर के बारे में भी नहीं सोच रहे हैं।

  19. यदि आप व्हाट्सएप के लिए जाँच कर रहे हैं, तो आपको \hऔर \v, के बीच चयन करना चाहिए । और आपको कभी भी उपयोग नहीं करना चाहिए \s, क्योंकि यह लोकप्रिय विश्वास के विपरीत नहीं [\h\v] है।

  20. यदि आप \nएक लाइन सीमा के लिए उपयोग कर रहे हैं , या \r\nफिर भी , तो आप इसे गलत कर रहे हैं। आपको उपयोग करना होगा \R, जो समान नहीं है!

  21. अगर आपको पता नहीं है कि यूनिकोड कब और क्यों कॉल करना है: स्ट्रिंगिंगप , तो आप बेहतर सीख चुके थे।

  22. केस-असंवेदनशील तुलनाओं के लिए यह जांचने की जरूरत है कि क्या दो चीजें समान अक्षर हैं, चाहे उनके विकृति विज्ञान और इस तरह की कोई बात नहीं हो। ऐसा करने का सबसे आसान तरीका मानक यूनिकोड :: कोलायत मॉड्यूल है। Unicode::Collate->new(level => 1)->cmp($a, $b)। वहाँ भी eqतरीके और ऐसे हैं, और आपको शायद matchऔर substrतरीकों के बारे में भी सीखना चाहिए । ये बिल्ट-इन पर अलग-अलग फायदे हैं।

  23. कभी-कभी यह अभी भी पर्याप्त नहीं है, और आपको यूनिकोड :: कोलायत :: लोकेल मॉड्यूल की आवश्यकता है, Unicode::Collate::Locale->new(locale => "de__phonebook", level => 1)->cmp($a, $b)इसके बजाय। गौर कीजिए कि Unicode::Collate::->new(level => 1)->eq("d", "ð")यह सच है, लेकिन Unicode::Collate::Locale->new(locale=>"is",level => 1)->eq("d", " ð")गलत है। इसी तरह, "एई" और "æ" हैं eqयदि आप स्थानों का उपयोग नहीं करते हैं, या यदि आप अंग्रेजी का उपयोग करते हैं, लेकिन वे आइसलैंडिक स्थान में भिन्न हैं। अब क्या? यह कठिन है, मैं आपको बताता हूं। आप इनमें से कुछ चीजों का परीक्षण करने के लिए ucsort के साथ खेल सकते हैं ।

  24. स्ट्रिंग " निनो " में पैटर्न सीवीसीवी (व्यंजन, स्वर, व्यंजन, स्वर) से मेल खाने के तरीके पर विचार करें । इसका NFD फॉर्म - जिसे आपने बेहतर तरीके से तैयार किया था, इसे याद रखने के लिए इसे याद किया है - यह "Nin \ x {303} o" बन जाता है। अब आप क्या करने जा रहे हो? यहां तक ​​कि यह भी दिखावा है कि एक स्वर है [aeiou](जो कि गलत है, वैसे), आप ऐसा कुछ भी करने में सक्षम नहीं होंगे (?=[aeiou])\X), क्योंकि NFD में भी 'ø' जैसा कोड बिंदु नहीं होता है ! हालांकि, यह यूसीए की तुलना में एक 'ओ' के बराबर परीक्षण करेगा जो मैंने अभी आपको दिखाया था। आप NFD पर भरोसा नहीं कर सकते, आपको UCA पर भरोसा करना होगा।


𝕤 𝕤 𝕤 𝕤 𝕤 𝕤 𝕤 𝕤 𝕤 𝕤 𝕤 𝕤 𝕤 𝕤 𝕤 𝕤


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

  1. कोड जो यह मानता है कि एन्कोडिंग निर्दिष्ट किए बिना एक पाठ फ़ाइल को खोल सकता है टूटी हुई है।

  2. डिफ़ॉल्ट एन्कोडिंग मानने वाला कोड कुछ प्रकार का देशी प्लेटफ़ॉर्म एन्कोडिंग है।

  3. कोड है कि जापानी या चीनी में वेब पृष्ठों UTF in 16 की तुलना में कम जगह लेता है में UTF wrong 8 गलत है।

  4. कोड जो पर्ल का उपयोग करता है, यूटीएफ का उपयोग करता है ass 8 आंतरिक रूप से गलत है।

  5. कोड जो मानता है कि एन्कोडिंग त्रुटियां हमेशा एक अपवाद उठाएंगी गलत है।

  6. Perl कोड बिंदुओं को मानने वाला कोड 0x10_FFFF तक सीमित है, गलत है।

  7. कोड जो मानता है कि आप $/किसी ऐसी चीज़ के लिए सेट कर सकते हैं जो किसी भी वैध लाइन विभाजक के साथ काम करेगी गलत है।

  8. कोड, जो केसफ़ॉल्डिंग, lc(uc($s)) eq $sया uc(lc($s)) eq $s, जैसे राउंडट्रिप समानता को मानता है, पूरी तरह से टूट गया है और गलत है। विचार करें कि uc("σ")और uc("ς") दोनों कर रहे हैं "Σ", लेकिन lc("Σ")संभवतः उन दोनों को वापस नहीं लौट सकते।

  9. कोड जो प्रत्येक लोअरकेस कोड बिंदु को मानता है एक अलग अपरकेस है, या इसके विपरीत, टूट गया है। उदाहरण के लिए, "ª"एक अपरकेस है जिसमें कोई अपरकेस नहीं है; जबकि दोनों "ᵃ"और "ᴬ"अक्षर हैं, लेकिन वे अक्षर नहीं हैं; हालाँकि, वे दोनों अपरकेस वर्जन के बिना लोअरकेस कोड पॉइंट हैं। समझ गया? वे हैं नहीं \p{Lowercase_Letter} दोनों होने के बावजूद, \p{Letter}और \p{Lowercase}

  10. कोड जो केस को बदलते हुए मानता है कि स्ट्रिंग की लंबाई नहीं बदलती है वह टूट गया है।

  11. कोड जो मानता है कि केवल दो मामले टूटे हैं। शीर्षक भी है।

  12. कोड जो केवल अक्षरों को मानता है मामला टूट गया है। सिर्फ अक्षरों से परे, यह संख्याओं, प्रतीकों और यहां तक ​​कि निशान का भी पता चला है। वास्तव में, मामला बदलने से भी कुछ मुख्य सामान्य श्रेणी में बदलाव किया जा सकता है, जैसे कि एक में \p{Mark}बदल जाना \p{Letter}। यह इसे एक स्क्रिप्ट से दूसरी स्क्रिप्ट में भी बदल सकता है।

  13. कोड जो मानता है कि मामला कभी भी स्थानीय-निर्भर नहीं है।

  14. कोड जो यूनिकोड मानता है, वह POSIX स्थानों के बारे में एक अंजीर देता है जो टूट गया है।

  15. कोड जो मानता है कि आप आधार को प्राप्त करने के लिए dicritics को हटा सकते हैं ASCII पत्र बुराई, अभी भी टूटे हुए, मस्तिष्क-क्षतिग्रस्त, गलत और मृत्युदंड के लिए औचित्य है।

  16. कोड जो मानता है कि विकृति विज्ञान \p{Diacritic}और निशान \p{Mark}वही हैं जो टूट गया है।

  17. कोड है कि मान लिया गया है \p{GC=Dash_Punctuation}जितना कवर के रूप में \p{Dash}टूट गया है।

  18. कोड जो डैश, हाइफ़न और मिन्यूज़ को मानता है, एक दूसरे के समान हैं, या यह कि प्रत्येक का एक ही है, टूटा हुआ और गलत है।

  19. हर कोड बिंदु मानने वाले कोड में एक से अधिक प्रिंट कॉलम नहीं टूटे हैं।

  20. कोड जो मानता है कि सभी \p{Mark}वर्ण शून्य प्रिंट कॉलम उठाते हैं वह टूट गया है।

  21. कोड जो मानता है कि वर्ण एक जैसे दिखते हैं, समान हैं

  22. कोड जो मानता है कि वर्ण एक जैसे नहीं दिखते हैं , समान नहीं हैं ।

  23. कोड जो मानता है कि एक पंक्ति में कोड बिंदुओं की संख्या की एक सीमा है जो सिर्फ एक \Xमेल कर सकती है गलत है।

  24. कोड है कि \Xएक \p{Mark}चरित्र के साथ शुरू कर सकते हैं गलत है कभी नहीं ।

  25. ऐसा कोड जो मानता है कि \Xदो गैर- \p{Mark}वर्णों को कभी पकड़ नहीं सकता है।

  26. कोड जो मानता है कि इसका उपयोग नहीं किया जा सकता है "\x{FFFF}"वह गलत है।

  27. एक गैर-बीएमपी कोड बिंदु को मानने वाला कोड जिसे दो UTF-16 (सरोगेट) कोड की आवश्यकता होती है, दो अलग-अलग UTF-8 वर्णों को कूटबद्ध करेगा, एक कोड इकाई, एक गलत है। यह नहीं है: यह एकल कोड बिंदु को एन्कोड करता है।

  28. यूटीएफ Code 16 या UTF ‐ 32 से ट्रांसकोड करने वाले कोड को UTF it 8 में अग्रणी BOMs के साथ तोड़ा जाता है यदि यह परिणामी UTF-8 के प्रारंभ में BOM डालता है। यह इतना बेवकूफ है कि इंजीनियर को अपनी पलकें हटा लेनी चाहिए।

  29. CESU-8 मानने वाला कोड मान्य UTF एन्कोडिंग गलत है। इसी तरह, कोड जो सोचता है कि U + 0000 को कूटना है क्योंकि "\xC0\x80"UTF-8 टूटा हुआ है और गलत है। ये लोग पलक उपचार के भी योग्य हैं।

  30. ऐसा कोड जो वर्णों को >हमेशा दाईं ओर मानता है और <हमेशा बाईं ओर इंगित करता है, गलत है - क्योंकि वे वास्तव में नहीं करते हैं।

  31. कोड है कि अगर आप पहली बार चरित्र उत्पादन Xऔर फिर चरित्र Y, मान लें कि जो XYगलत होगा के रूप में दिखाएगा । कभी-कभी वे नहीं करते।

  32. कोड जो मानता है कि अंग्रेजी ठीक से लिखने के लिए ASCII काफी अच्छा है, मूर्ख, अनपढ़, अनपढ़, टूटा हुआ, दुष्ट और गलत है। उनके सिर के साथ बंद! अगर ऐसा लगता है कि बहुत चरम है, तो हम समझौता कर सकते हैं: इसलिए वे केवल एक पैर से अपने बड़े पैर के अंगूठे के साथ टाइप कर सकते हैं। (बाकी नलिका नलिका होगी।)

  33. कोड जो मानता है कि सभी \p{Math}कोड बिंदु दिखाई देने वाले वर्ण गलत हैं।

  34. कोड जो मानता है कि \wकेवल अक्षर, अंक और अंडरस्कोर गलत है।

  35. कोड है कि मानता है ^और ~विराम चिह्न हैं गलत है।

  36. कोड जो मानता है कि üएक umlaut गलत है।

  37. ऐसा कोड जो मानता है कि उनमें कोई भी अक्षर गलत हैं।

  38. कोड जो मानता \p{InLatin}है कि \p{Latin}जघन्य रूप से टूट गया है।

  39. कोड जो मानता है कि \p{InLatin}लगभग कभी उपयोगी है, लगभग निश्चित रूप से गलत है।

  40. ऐसा कोड जो मानता है कि $FIRST_LETTERकिसी वर्णमाला के पहले अक्षर के $LAST_LETTERरूप में और उसी वर्णमाला के अंतिम अक्षर के रूप में दिया गया है, [${FIRST_LETTER}-${LAST_LETTER}]जिसका कोई भी अर्थ है जो लगभग हमेशा टूटा हुआ और गलत और अर्थहीन होता है।

  41. ऐसा कोड जो मानता है कि किसी के नाम में केवल कुछ अक्षर हो सकते हैं, वह मूर्ख, आक्रामक और गलत है।

  42. कोड जो यूनिकोड को ASCII को कम करने की कोशिश करता है, वह केवल गलत नहीं है, इसके अपराधी को फिर से प्रोग्रामिंग में काम करने की अनुमति नहीं दी जानी चाहिए। अवधि। मैं सकारात्मक भी नहीं हूं कि उन्हें फिर से देखने की अनुमति नहीं दी जानी चाहिए, क्योंकि यह स्पष्ट रूप से उन्हें अब तक बहुत अच्छा नहीं लगा है।

  43. कोड जो मानता है कि टेक्स्टफाइल एनकोडिंग का ढोंग करने का कोई तरीका मौजूद नहीं है, टूटा हुआ और खतरनाक है। के रूप में अच्छी तरह से दूसरी आंख बाहर भी प्रहार कर सकते हैं।

  44. वह कोड जो अज्ञात वर्णों को परिवर्तित करता ?है, टूटा हुआ, मूर्ख, साहसी होता है, और मानक अनुशंसा के विपरीत चलता है, जो कहता है कि नहीं! आरटीएफएम क्यों नहीं।

  45. कोड है कि विश्वास करता है कि यह मज़बूती से अनुमान लगा सकता है कि एक अचिह्नित टेक्सफ़ाइल की एन्कोडिंग, हब्रीस और नाओवे के एक घातक मैलांगे के लिए दोषी है कि ज़ीउस से केवल एक बिजली का बोल्ट ठीक करेगा।

  46. कोड जो मानता है कि आप printfपैड को s चौड़ाई का उपयोग कर सकते हैं और यूनीकोड ​​डेटा को सही और गलत और गलत है।

  47. कोड जो आपको एक बार दिए गए नाम से एक फ़ाइल बनाने में सफलतापूर्वक विश्वास करता है, कि जब आप चलाते हैं lsया readdirइसके संलग्न निर्देशिका पर, आपको वास्तव में उस फ़ाइल का नाम मिलेगा जिसे आपने इसे बनाया था, जो छोटी गाड़ी है, टूटी हुई है, और गलत है। इससे आश्चर्यचकित होना बंद करो!

  48. कोड जो मानता है कि UTF-16 एक निश्चित-चौड़ाई वाली एन्कोडिंग है, बेवकूफ, टूटी हुई और गलत है। उनके प्रोग्रामिंग लाइसेंस को निरस्त करें।

  49. एक प्लेन से कोड पॉइंट्स को अलग करने वाले कोड को किसी दूसरे प्लेन से अलग सफेद रंग का माना जाता है। वापस विद्यालय जाओ।

  50. कोड जो मानता है कि सामान /s/iकेवल मैच "S"कर सकता "s"है या टूट गया है और गलत है। आप चौंक जाएंगे।

  51. कोड जो उपयोग \PM\pM*करने के बजाय अंगूर के गुच्छों को खोजने के लिए उपयोग करता \Xहै, टूटा हुआ और गलत है।

  52. जो लोग एएससीआईआई दुनिया में वापस जाना चाहते हैं, उन्हें ऐसा करने के लिए पूरे दिल से प्रोत्साहित किया जाना चाहिए, और उनके शानदार उन्नयन के सम्मान में, उन्हें उनकी सभी डेटा-एंट्री आवश्यकताओं के लिए एक प्री-इलेक्ट्रिक मैनुअल टाइपराइटर के साथ ग्रिटिस प्रदान किया जाना चाहिए । उन्हें भेजे गए संदेशों को to टेली टेलीग्राफ के माध्यम से प्रति पंक्ति 40 वर्णों पर भेजा जाना चाहिए और एक कूरियर द्वारा हाथ से वितरित किया जाना चाहिए। रूक जा।


𝖀 𝖀 😱 𝖀 𝖀 𝖀 𝖀 𝖀 𝖀


मुझे नहीं पता कि Un "यूनिकोड में डिफ़ॉल्ट रूप से आप कितना अधिक" लिख सकते हैं। ठीक है, हाँ मैं करता हूँ: आप का उपयोग किया जाना चाहिए Unicode::Collateऔर Unicode::LineBreakभी। और शायद अधिक।

जैसा कि आप देख, वहाँ अभी तक भी कई यूनिकोड चीजें हैं जो आप वास्तव में कर रहे हैं करते हैं के बारे में वहाँ के लिए चिंता करने की ज़रूरत कभी के रूप में "यूनिकोड को डिफ़ॉल्ट" इस तरह के किसी भी बात से मौजूद हैं।

आप जो खोज करने जा रहे हैं, जैसा कि हमने, 5.8 में वापस किया है, कि कोड पर इन सभी चीजों को लागू करना असंभव है, जो कि उनके लिए शुरू से ही सही डिजाइन नहीं किया गया है। आपके सुविचारित स्वार्थ ने पूरी दुनिया को तोड़ दिया।

और एक बार जब आप कर लेते हैं, तब भी महत्वपूर्ण मुद्दे होते हैं जिन्हें सही करने के लिए बहुत अधिक विचार की आवश्यकता होती है। कोई स्विच नहीं है जिसे आप फ्लिप कर सकते हैं। मस्तिष्क के अलावा कुछ भी नहीं, और मेरा मतलब है असली मस्तिष्क , यहाँ पर्याप्त होगा। वहाँ बहुत सारी चीजें आप सीखना है की एक बिल्ली है। मॉड्यूल टाइपराइटर मैनुअल टाइपराइटर के लिए, आप अज्ञानता में चुपके से उम्मीद नहीं कर सकते। यह 21ode वीं सदी है, और आप यूनिकोड को इच्छाधारी अज्ञानता से दूर नहीं कर सकते।

आपको इसे सीखना होगा। अवधि। यह इतना आसान कभी नहीं होगा कि "सब कुछ बस काम करता है," क्योंकि यह गारंटी देगा कि बहुत सारी चीजें काम नहीं करती हैं - जो इस धारणा को अमान्य करता है कि कभी भी "यह सब काम करने का एक तरीका हो सकता है।"

आप बहुत कम और बहुत ही सीमित कार्यों के लिए कुछ उचित चूक प्राप्त करने में सक्षम हो सकते हैं, लेकिन उन चीजों के बारे में बिना सोचे-समझे जो मैंने किया है उससे कहीं अधिक।

सिर्फ एक उदाहरण के रूप में, कैनोनिकल ऑर्डरिंग कुछ वास्तविक सिरदर्द पैदा करने वाली है। 😭 "\x{F5}" 'O' , "o\x{303}" 'O' , "o\x{303}\x{304}" 'ȭ' , और "o\x{304}\x{303}" 'O' सभी मैच चाहिए 'O' है, लेकिन दुनिया में कैसे आपको लगता है कि ऐसा करने के लिए जा रहे हैं? यह दिखने में जितना कठिन है, लेकिन यह कुछ ऐसा है जिसकी आपको आवश्यकता है। 💣

अगर वहाँ एक बात मैं पर्ल के बारे में पता है, यह अपने यूनिकोड बिट्स करते हैं और ऐसा नहीं करते हैं क्या है, और यह बात मैं तुमसे वादा करता हूँ: "ᴛʜᴇʀᴇ ɪs ɴᴏ Uɴɪᴄᴏᴅᴇ ᴍᴀɢɪᴄ ʙᴜʟʟᴇᴛ" 😞

आप बस कुछ चूक नहीं बदल सकते और सहज नौकायन प्राप्त कर सकते हैं। यह सच है कि मैं PERL_UNICODEसेट के साथ "SA"all चलाता हूं , लेकिन यह सब है, और यहां तक ​​कि ज्यादातर कमांड-लाइन सामान के लिए है। वास्तविक काम के लिए, मैं ऊपर उल्लिखित सभी कई चरणों से गुजरता हूं, और मैं इसे बहुत, ** बहुत ** सावधानी से करता हूं।


Ƨ ƨ 😈dləɥ ƨᴉɥʇ ɥdoɐ puʻ ɐλəɔᴉp əɔᴉu ƨ ƨnl poo⅁ ƨ


56
जैसे शरम पेंडले ने इशारा किया: "सभी!"। यदि मैं आज कुछ नया लिखता हूं, तो यूटीएफ -8 को चीजों को प्राप्त करने का सबसे आसान तरीका होना चाहिए । यह नहीं। आपका बॉयलरप्लेट इसे प्रूव करता है। इतने सारे टम्बलरों को सही स्थिति में लाने के लिए हर किसी के पास ऐसा ज्ञान नहीं है। मुझे क्षमा करें, मेरे पास लंबे और कठिन दिन थे, इसलिए मैं कल उदाहरणों के साथ मुख्य प्रविष्टि में टिप्पणी करूंगा।
सप्ताह

17
उपरोक्त सूची को पढ़ने से एक निष्कर्ष स्पष्ट होना चाहिए: केस-फोल्ड न करें। बस नहीं है। कभी। कम्प्यूटेशनल रूप से महंगा और शब्दार्थ के साथ जो कि जो कुछ भी है उस पर महत्वपूर्ण रूप से निर्भर करता है "लोकेल" की पहचान करने का असफल प्रयास करता है।
टिम ब्रे

72
क्या मैं केवल एक ऐसा व्यक्ति हूँ जो इसे विडम्बनापूर्ण मानता है कि tchrist द्वारा यह पोस्ट FF / Chrome / IE / Opera पर बेतहाशा अलग है, कुछ समय के लिए अवैधता की बात है?
नुकसानदेह

15
जबकि मैं आम तौर पर पोस्ट को पसंद करता हूं, और अपवोट करता था, एक चीज मुझे नरक से बाहर निकालती है। बहुत सारे "कोड है कि ... टूट गया है" है। हालांकि मैं बयान के साथ बहस नहीं करता हूं, मुझे लगता है कि टूटना दिखाना अच्छा होगा। इस तरह यह एक शेख़ी से शिक्षा के लिए (जवाब का यह हिस्सा) होगा।

36
@xenoterracide नहीं मैंने जानबूझकर समस्याग्रस्त कोड बिंदुओं का उपयोग नहीं किया; यह आपको जॉर्ज डोरोस के सुपर-भयानक सिम्बोला फ़ॉन्ट को स्थापित करने के लिए प्राप्त करने की साजिश है , जिसमें यूनिकोड 6.0 शामिल है। Explain @depesz यह बताने के लिए यहाँ जगह नहीं है कि प्रत्येक टूटा हुआ विस्फोट गलत क्यों है। @ एलोनबॉयल बहुत सारे और बहुत सारे यूनिकोड पर लागू होते हैं, न कि केवल पर्ल में। इस सामग्री में से कुछ 🐪 प्रोग्रामिंग पेरल of , 4 वें संस्करण में दिख सकते हैं , जो अक्टूबर में समाप्त हो गए। 🎃 मेरे पास इस पर काम करने के लिए एक महीना बचा है, और यूनिकोड left है; regexes, भी
tchrist

96

यूनिकोड पाठ को संसाधित करने के लिए दो चरण हैं। पहला है "मैं इसे कैसे इनपुट कर सकता हूं और बिना जानकारी खोए इसे आउटपुट कर सकता हूं"। दूसरा है "मैं स्थानीय भाषा सम्मेलनों के अनुसार पाठ का इलाज कैसे करूं"।

tchrist की पोस्ट दोनों को कवर करती है, लेकिन दूसरा हिस्सा वह है जहाँ उसके पोस्ट का 99% टेक्स्ट आता है। अधिकांश प्रोग्राम I / O को सही तरीके से हैंडल नहीं करते हैं, इसलिए यह समझना महत्वपूर्ण है कि इससे पहले कि आप भी सामान्यीकरण और टकराव के बारे में चिंता करना शुरू कर दें।

इस पोस्ट का उद्देश्य उस पहली समस्या को हल करना है

जब आप पर्ल में डेटा पढ़ते हैं, तो यह परवाह नहीं करता है कि यह एन्कोडिंग क्या है। यह कुछ मेमोरी को आवंटित करता है और बाइट्स को वहां से हटा देता है। यदि आप कहते हैं print $str, तो यह आपके टर्मिनल के लिए उन बाइट्स को उड़ा देता है, जो शायद यह सब कुछ मानने के लिए सेट है जो इसे लिखा गया है UTF-8, और आपका पाठ दिखाता है।

अद्भुत।

को छोड़कर, यह नहीं है। यदि आप डेटा को पाठ के रूप में मानने का प्रयास करते हैं, तो आप देखेंगे कि कुछ बुरा हो रहा है। आपको यह देखने की ज़रूरत नहीं lengthहै कि पर्ल आपके स्ट्रिंग के बारे में क्या सोचता है और आप अपनी स्ट्रिंग के बारे में क्या सोचते हैं। एक-लाइनर लिखें: perl -E 'while(<>){ chomp; say length }'और टाइप करें 文字化けऔर आपको 12 ... सही उत्तर नहीं, 4।

ऐसा इसलिए है क्योंकि पर्ल मानता है कि आपका स्ट्रिंग टेक्स्ट नहीं है। आपको यह बताना होगा कि यह पाठ है इससे पहले कि यह आपको सही उत्तर देगा।

यह काफी आसान है; एनकोड मॉड्यूल में ऐसा करने के लिए कार्य हैं। सामान्य प्रविष्टि बिंदु Encode::decode(या use Encode qw(decode), निश्चित रूप से) है। यह फ़ंक्शन बाहरी दुनिया से कुछ स्ट्रिंग लेता है (जिसे हम "ऑक्टेट्स" कहेंगे, "8-बिट बाइट्स" कहने का तरीका), और इसे कुछ पाठ में बदल देता है जिसे पर्ल समझ जाएगा। पहला तर्क एक वर्ण एन्कोडिंग नाम है, जैसे "UTF-8" या "ASCII" या "EUC-JP"। दूसरा तर्क स्ट्रिंग है। वापसी मान पाठ युक्त पर्ल स्केलर है।

(वहाँ भी है Encode::decode_utf8, जो एन्कोडिंग के लिए UTF-8 मानता है।)

यदि हम अपने वन-लाइनर को फिर से लिखते हैं:

perl -MEncode=decode -E 'while(<>){ chomp; say length decode("UTF-8", $_) }'

हम "化 化 में टाइप करते हैं और परिणाम के रूप में" 4 "प्राप्त करते हैं। सफलता।

वहीं, पर्ल में 99% यूनिकोड समस्याओं का समाधान है।

कुंजी यह है कि जब भी कोई पाठ आपके कार्यक्रम में आता है, तो आपको उसे डिकोड करना होगा। इंटरनेट पात्रों को प्रसारित नहीं कर सकता। फ़ाइलें वर्णों को संग्रहीत नहीं कर सकती हैं। आपके डेटाबेस में कोई वर्ण नहीं हैं। केवल ऑक्टेट हैं, और आप ऑक्ट्स को पर्ल के पात्रों के रूप में नहीं मान सकते। आपको एनकोड मॉड्यूल के साथ पर्ल वर्णों में एन्कोडेड ओकटेट को डीकोड करना होगा।

समस्या का दूसरा हिस्सा आपके प्रोग्राम से डेटा प्राप्त कर रहा है। यह आसान है; आप बस कहते हैं use Encode qw(encode), यह तय करें कि आपका डेटा किस एन्कोडिंग में होगा (UTF-8 टर्मिनलों के लिए जो UTF-8, UTF-16 को विंडोज़ पर फ़ाइलों के लिए समझा जाता है, आदि), और फिर आउटपुट के encode($encoding, $data)बजाय आउटपुट का परिणाम $data

यह ऑपरेशन पर्ल के वर्णों को परिवर्तित करता है, जो कि आपके प्रोग्राम को संचालित करता है, बाहरी दुनिया द्वारा उपयोग किए जा सकने वाले ऑक्टेट पर। यह बहुत आसान होगा यदि हम केवल इंटरनेट पर या अपने टर्मिनलों पर वर्ण भेज सकते हैं, लेकिन हम नहीं कर सकते: केवल ओकटेट। इसलिए हमें पात्रों को अष्टक में बदलना होगा, अन्यथा परिणाम अपरिभाषित हैं।

संक्षेप में: सभी आउटपुट को एनकोड करें और सभी इनपुट को डीकोड करें।

अब हम तीन मुद्दों के बारे में बात करेंगे जो इसे थोड़ा चुनौतीपूर्ण बनाते हैं। पहला पुस्तकालय है। क्या वे पाठ को सही ढंग से संभालते हैं? जवाब है ... वे कोशिश करते हैं। यदि आप एक वेब पेज डाउनलोड करते हैं, तो LWP आपको अपना परिणाम वापस पाठ के रूप में देगा। यदि आप परिणाम पर सही विधि कहते हैं, तो यह (और ऐसा ही होता है decoded_content, नहीं content, जो कि सर्वर से प्राप्त केवल ओकटेट स्ट्रीम है।) डेटाबेस ड्राइवर परतदार हो सकते हैं; यदि आप DBD का उपयोग करते हैं :: SQLite बस पर्ल के साथ, यह काम करेगा, लेकिन अगर किसी अन्य टूल ने आपके डेटाबेस में UTF-8 के अलावा कुछ एन्कोडिंग के रूप में संग्रहीत पाठ को रखा है ... अच्छी तरह से ... यह सही ढंग से संभाला नहीं जा रहा है। जब तक आप इसे सही तरीके से संभालने के लिए कोड नहीं लिखते हैं।

आउटपुट डेटा आमतौर पर आसान होता है, लेकिन यदि आप "प्रिंट में विस्तृत चरित्र" देखते हैं, तो आप जानते हैं कि आप कहीं एन्कोडिंग को गड़बड़ कर रहे हैं। उस चेतावनी का अर्थ है "हे, आप बाहरी दुनिया में पर्ल पात्रों को लीक करने की कोशिश कर रहे हैं और इसका कोई मतलब नहीं है"। आपका कार्यक्रम काम करता प्रतीत होता है (क्योंकि दूसरा छोर आमतौर पर कच्चे पर्ल पात्रों को सही ढंग से संभालता है), लेकिन यह बहुत टूट गया है और किसी भी समय काम करना बंद कर सकता है। एक स्पष्ट के साथ इसे ठीक करें Encode::encode!

दूसरी समस्या UTF-8 एनकोडेड सोर्स कोड है। जब तक आप use utf8प्रत्येक फ़ाइल के शीर्ष पर नहीं कहते हैं , तब तक पर्ल यह नहीं मानेगा कि आपका स्रोत कोड UTF-8 है। इसका मतलब है कि हर बार जब आप कुछ कहते हैं my $var = 'ほげ', तो आप अपने प्रोग्राम में कचरा इंजेक्ट कर रहे हैं जो पूरी तरह से सब कुछ तोड़ देगा। आपको "utf8" का उपयोग करने की आवश्यकता नहीं है, लेकिन यदि आप नहीं करते हैं, तो आपको अपने प्रोग्राम में किसी भी गैर- ASCII वर्ण का उपयोग नहीं करना चाहिए

तीसरी समस्या यह है कि पर्ल द पास्ट को कैसे हैंडल करता है। बहुत समय पहले, यूनिकोड जैसी कोई चीज नहीं थी, और पर्ल ने माना कि सब कुछ लैटिन -1 पाठ या द्विआधारी था। इसलिए जब डेटा आपके कार्यक्रम में आता है और आप इसे पाठ के रूप में मानने लगते हैं, तो पर्ल प्रत्येक ऑक्टेट को लैटिन -1 वर्ण के रूप में मानता है। इसीलिए, जब हमने "化 け," की लंबाई पूछी, तो हमें मिला 12. पर्ल ने अनुमान लगाया था कि हम लैटिन -1 स्ट्रिंग "åååã" पर काम कर रहे थे (जो कि 12 अक्षर हैं, जिनमें से कुछ नॉन-प्रिंटिंग हैं)।

इसे एक "निहित उन्नयन" कहा जाता है, और यह पूरी तरह से उचित काम है, लेकिन यह नहीं है कि आप क्या चाहते हैं यदि आपका पाठ लैटिन -1 नहीं है। इसलिए इनपुट को स्पष्ट रूप से डिकोड करना महत्वपूर्ण है: यदि आप ऐसा नहीं करते हैं, तो पर्ल होगा, और यह गलत हो सकता है।

लोग मुश्किल में पड़ जाते हैं, जहां उनका आधा डेटा एक उचित चरित्र स्ट्रिंग है, और कुछ अभी भी द्विआधारी है। पर्ल उस हिस्से की व्याख्या करेगा जो अभी भी द्विआधारी है क्योंकि यह लैटिन -1 पाठ है और फिर इसे सही चरित्र डेटा के साथ संयोजित करें। यह आपके पात्रों को सही ढंग से आपके प्रोग्राम को तोड़ने का काम कर देगा, लेकिन वास्तव में, आपने इसे पर्याप्त रूप से तय नहीं किया है।

यहां एक उदाहरण दिया गया है: आपके पास एक प्रोग्राम है जो एक UTF-8-एन्कोडेड पाठ फ़ाइल को पढ़ता है, आप PILE OF POOप्रत्येक लाइन के लिए एक यूनिकोड से निपटते हैं , और आप इसे प्रिंट करते हैं। आप इसे लिखें:

while(<>){
    chomp;
    say "$_ 💩";
}

और फिर कुछ UTF-8 एन्कोडेड डेटा पर चलते हैं, जैसे:

perl poo.pl input-data.txt

यह प्रत्येक पंक्ति के अंत में एक पू के साथ UTF-8 डेटा प्रिंट करता है। बिल्कुल सही, मेरा कार्यक्रम काम करता है!

लेकिन नहीं, तुम सिर्फ द्विआधारी संघनन कर रहे हो। आप फ़ाइल से ऑक्टेट पढ़ रहे हैं, \nचॉम्प के साथ निकाल रहे हैं , और फिर PILE OF POOचरित्र के UTF-8 में बाइट्स से निपट रहे हैं । जब आप फ़ाइल से डेटा को डीकोड करने और आउटपुट को एनकोड करने के लिए अपने प्रोग्राम को संशोधित करते हैं, तो आप देखेंगे कि आपको पू के बजाय कचरा ("of ©") मिलेगा। यह आपको विश्वास दिलाएगा कि इनपुट फ़ाइल को डिकोड करना गलत काम है। यह।

समस्या यह है कि पू को अव्यवस्थित रूप से लैटिन -1 के रूप में उन्नत किया जा रहा है। यदि आप use utf8बाइनरी के बजाय शाब्दिक पाठ बनाते हैं, तो यह फिर से काम करेगा!

(यह एक नंबर की समस्या है जो मुझे यूनिकोड के साथ लोगों की मदद करते समय दिखाई देती है। उन्होंने सही भाग किया और इससे उनका कार्यक्रम टूट गया। यह अपरिभाषित परिणामों से दुखी है: आपके पास लंबे समय तक काम करने का कार्यक्रम हो सकता है, लेकिन जब आप इसे सुधारना शुरू करते हैं। यह टूट जाता है। चिंता मत करो, यदि आप अपने प्रोग्राम में एनकोड / डीकोड स्टेटमेंट जोड़ रहे हैं और यह टूट जाता है, तो इसका मतलब है कि आपके पास काम करने के लिए काम है। अगली बार, जब आप शुरुआत से यूनिकोड को ध्यान में रखते हैं, तो यह होगा। बहुत आसान!)

वास्तव में आपको पर्ल और यूनिकोड के बारे में जानना चाहिए। यदि आप पर्ल को बताते हैं कि आपका डेटा क्या है, तो इसमें सभी लोकप्रिय प्रोग्रामिंग भाषाओं में सर्वश्रेष्ठ यूनिकोड का समर्थन है। यदि आप मानते हैं कि यह जादुई रूप से आपको पता होगा कि आप इसे किस प्रकार का पाठ खिला रहे हैं, तो आप अपने डेटा को अपरिवर्तनीय रूप से रद्दी करने जा रहे हैं। सिर्फ इसलिए कि आपका प्रोग्राम आपके UTF-8 टर्मिनल पर आज काम करता है, इसका मतलब यह नहीं है कि यह कल UTF-16 एन्कोडेड फ़ाइल पर काम करेगा। तो अब इसे सुरक्षित करें, और अपने उपयोगकर्ताओं के डेटा को ट्रैश करने के सिरदर्द से खुद को बचाएं!

यूनिकोड से निपटने का आसान हिस्सा आउटपुट और डिकोडिंग इनपुट है। कठिन हिस्सा आपके सभी इनपुट और आउटपुट को ढूंढ रहा है, और यह निर्धारित करता है कि यह कौन सा एन्कोडिंग है। लेकिन इसीलिए आपको मोटी रकम मिलती है :)


सिद्धांत को अच्छी तरह से समझाया गया है, लेकिन आई / ओ के लिए व्यावहारिक दृष्टिकोण गायब है। स्पष्ट रूप से Encodeमॉड्यूल का उपयोग थकाऊ और त्रुटि-प्रवण है, और यह I / O से संबंधित कोड को वास्तव में दर्दनाक बनाता है। I / O परतें एक समाधान प्रदान करती हैं क्योंकि वे पारदर्शी रूप से सांकेतिक शब्दों में बदलना और डिकोड करते हैं, जहां जरूरत होती है। openऔर binmodeउनके विनिर्देशन के लिए अनुमति देते हैं, और openप्रज्ञा चूक को सेट करती है, क्योंकि उनके उत्तर में tchrist अनुशंसा करता है।
पालिक

48

हम सभी इस बात पर सहमत हैं कि यह कई कारणों से एक कठिन समस्या है, लेकिन यह ठीक यही कारण है कि इसे हर किसी के लिए आसान बनाने की कोशिश की जाती है।

CPAN, utf8 :: all पर एक हालिया मॉड्यूल है , जो "यूनिकोड चालू करने का प्रयास करता है। यह सब"।

जैसा कि बताया गया है, आप जादुई रूप से पूरे सिस्टम (बाहर के कार्यक्रमों, बाहरी वेब अनुरोधों आदि) को यूनिकोड के रूप में अच्छी तरह से उपयोग नहीं कर सकते हैं, लेकिन हम समझदार उपकरण बनाने के लिए एक साथ काम कर सकते हैं जो सामान्य समस्याओं को आसान बनाते हैं। यही कारण है कि हम प्रोग्रामर हैं।

यदि utf8 :: सभी कुछ ऐसा नहीं करते हैं जो आपको लगता है कि इसे करना चाहिए, तो इसे बेहतर बनाने के लिए इसे सुधारें। या चलो अतिरिक्त उपकरण बनाते हैं जो लोगों की अलग-अलग जरूरतों के साथ-साथ संभव के अनुरूप हो सकते हैं।

`


5
मुझे उद्धृत मॉड्यूल में सुधार के लिए बहुत सारे कमरे दिखाई देते हैं utf8::all। यह unicode_stringsफीचर से पहले लिखा गया था , जिस पर F them written ᴏɴɢ Lᴀ Lᴛs re regexes को ठीक करता /uहै। मुझे यकीन नहीं है कि यह एन्कोडिंग त्रुटियों पर एक अपवाद उठाता है, और यह कुछ ऐसा है जो आपके पास वास्तव में होना चाहिए। यह use charnames ":full"प्राग्मा में लोड नहीं करता है , जो अभी तक ऑटोडेड नहीं है। यह और इसके बजाय [a-z], printfस्ट्रिंग चौड़ाई पर, \nइसके बजाय का उपयोग करने की चेतावनी नहीं देता है , लेकिन शायद वे अधिक बात कर रहे हैं। अगर यह मैं होता, तो मैं 𝐍𝐅𝐃 को और I'd में जोड़ता। \R.\XPerl::Critic
tchrist

13
@tchrist utf8 के लिए इश्यू ट्रैकर :: सब यहाँ है। github.com/doherty/utf8-all/issues वे आपके सुझाव सुनना पसंद करेंगे।
श्वेर्न

4
@ शेवर्न: :s, लेकिन मेरे द्वारा यहां लिखे गए सामान से मुक्त और पिंच करने के लिए स्वतंत्र महसूस करें। सच कहूं, तो मैं अभी भी महसूस कर रहा हूं / सीख रहा हूं कि क्या किया जा सकता है और क्या किया जाना चाहिए। यहाँ एक अच्छा उदाहरण है ऑफलोडिंग छँटाई से unichars -gs '/(?=\P{Ll})\p{Lower}|(?=\P{Lu})\p{Upper}/x' | ucsort --upper | cat -n | less -r। इसी तरह, छोटे प्रीप्रोसेसिंग कदम ... | ucsort --upper --preprocess='s/(\d+)/sprintf "%#012d", $1/ge'वास्तव में बहुत अच्छे हो सकते हैं, और मैं उनके लिए दूसरों के फैसले नहीं करना चाहता। मैं अभी भी अपना यूनिकोड टूलबॉक्स बना रहा हूं ।
tchrist

35

मुझे लगता है कि आप यूनिकोड और पर्ल से इसके संबंध को गलत समझते हैं। कोई फर्क नहीं पड़ता कि आप डेटा को किस तरह से स्टोर करते हैं, यूनिकोड, आईएसओ-8859-1 , या कई अन्य चीजें, आपके प्रोग्राम को यह जानना होगा कि इनपुट (डिकोडिंग) के रूप में प्राप्त बाइट्स की व्याख्या कैसे करें और यह उस जानकारी का प्रतिनिधित्व कैसे करें जो इसे आउटपुट करना चाहता है (एन्कोडिंग )। उस व्याख्या को गलत समझें और आप डेटा को इकट्ठा कर लें। आपके प्रोग्राम के अंदर कुछ मैजिक डिफॉल्ट सेटअप नहीं है जो आपके प्रोग्राम के बाहर के सामान को बताए कि कैसे कार्य करना है।

आपको लगता है कि यह कठिन है, सबसे अधिक संभावना है, क्योंकि आप एएससीआईआई के सब कुछ के लिए उपयोग किए जाते हैं। आप जिस चीज के बारे में सोच रहे थे, उसे प्रोग्रामिंग भाषा ने आसानी से नजरअंदाज कर दिया था और उसके साथ बातचीत करने के लिए सभी चीजों को अनदेखा कर दिया था। यदि सब कुछ यूटीएफ -8 के अलावा कुछ भी नहीं करता है और आपके पास कोई विकल्प नहीं है, तो यूटीएफ -8 उतना ही आसान होगा। लेकिन सब कुछ UTF-8 का उपयोग नहीं करता है। उदाहरण के लिए, आप नहीं चाहते हैं कि आपका इनपुट हैंडल यह सोचें कि यह UTF-8 ऑक्टेट हो रहा है जब तक कि यह वास्तव में नहीं है, और आप नहीं चाहते कि आपका आउटपुट हैंडल UTF-8 हो, यदि उनसे पढ़ने वाली चीज़ UTF-8 को संभाल सकती है । पर्ल के पास उन चीजों को जानने का कोई तरीका नहीं है। इसलिए आप प्रोग्रामर हैं।

मुझे नहीं लगता कि पर्ल 5 में यूनिकोड बहुत जटिल है। मुझे लगता है कि यह डरावना है और लोग इससे बचते हैं। एक अंतर है। उस अंत तक, मैंने यूनीकोड ​​को लर्निंग पर्ल, 6 वें संस्करण में रखा है , और प्रभावी पर्ल प्रोग्रामिंग में बहुत अधिक यूनिकोड सामान है । आपको यूनिकोड और यह कैसे काम करता है, यह जानने और समझने के लिए समय बिताना होगा। आप अन्यथा प्रभावी रूप से इसका उपयोग करने में सक्षम नहीं होंगे।


3
मुझे लगता है कि आपके पास एक बिंदु है: यह डरावना है। क्या यह होना चाहिए? मेरे लिए यूनिकोड आशीर्वाद है, पर्ल 5 में इसका उपयोग नहीं है (मैं कुछ भी एएससीआईआई नहीं मानता हूं, मेरी मातृभाषा को कम से कम iso8859-4 की आवश्यकता है)। मैंने रोटोडो और सब कुछ स्थापित किया जो मैंने UTF-8 (इस सीमित सैंडबॉक्स में) के साथ काम किया। क्या मैं कुछ भुल गया? मैं इसे फिर से तनाव देता हूं: ठीक ट्यून किए गए यूनिकोड का समर्थन करना अच्छा है, लेकिन अधिकांश समय इसके लिए कोई आवश्यकता नहीं है। विषय पर भय दूर करने के लिए, एक तरीका यह है कि हर कोई इंटर्नल को समझने के लिए बहुत कुछ पढ़ता है। अन्य: हमारे पास विशेष प्रज्ञा है, जिससे use utf8_everywhereलोग खुश होते हैं। आखिर क्यों नहीं?
सप्ताह

3
मुझे अभी भी लगता है कि आप इस बिंदु को याद कर रहे हैं। क्या काम किया? आपको इंटर्न को समझने की आवश्यकता नहीं है। आपको बाहरी लोगों को समझने की आवश्यकता है और आप उन तारों को कैसे संभालना चाहते हैं जिनमें अलग-अलग एन्कोडिंग और एक ही वर्ण के अलग-अलग प्रतिनिधित्व हैं। टॉम की सलाह को फिर से पढ़ें। वह जो कहता है, उसमें से अधिकांश मुझे लगता है कि आप पाएंगे कि राडोको आपके लिए नहीं है।
ब्रायन डी फॉय

1
@wk: रैंडी का जवाब फिर से पढ़ें उसने पहले ही आपको बता दिया है कि सीमाएं क्या हैं।
ब्रायन डी फॉय

2
@ ब्रायन डी फोए: मुझे लगता है कि वे सीमाएं ठीक हैं, जैसे कि ट्रिस्टर कहते हैं, हर पहलू के लिए कोई जादू की गोली नहीं है (मैं मानता हूं: मैंने यह सवाल पूछने से पहले उनमें से ज्यादातर को नहीं देखा था)। इसलिए, जब हम utf8 :: सब कुछ के साथ बहुत सारे मूल सामान को कवर करते हैं, तो सभी के लिए अपनी खुद की विशाल बॉयलरप्लेट बनाने की आवश्यकता नहीं होती है, केवल काम करने के लिए utf8 हैंडलिंग पर मूल बातें प्राप्त करने के लिए। "सभी में कोई डर नहीं" के साथ मेरा मतलब है: हर कोई अपनी परियोजनाओं को यह जानकर शुरू कर सकता है कि मूल बातें कवर की गई हैं। हां, आप सही हैं, अभी भी बहुत सारी समस्याएं हैं। लेकिन जब शुरुआत करना आसान होता है, तो हम उन लोगों को हल करने में अधिक लोग शामिल होंगे। IMHO
wk

1
@wk - "utf8: all" या "uni :: perl: केवल एक ही" गलत है - वे CORE में नहीं हैं - इसलिए सभी को CPAN से इसे इंस्टॉल करना होगा। और यदि आपको लगता है कि यह बड़ा नहीं है। सौदा - पुनर्विचार कृपया - हाँ, यह सहायक मॉड्यूल के साथ utf8 का उपयोग करना आसान है। इसके बिना,
कोरल

28

इस सूत्र को पढ़ते हुए, मुझे अक्सर यह धारणा मिलती है कि लोग " यूटीएफ -8 " का उपयोग " यूनिकोड " के पर्याय के रूप में कर रहे हैं । कृपया यूनिकोड के "कोड-पॉइंट्स" के बीच अंतर करें, जो एएससीआईआई कोड और यूनिकोड के विभिन्न "एनकोडिंग्स" के बढ़े हुए रिश्तेदार हैं। और उनमें से कुछ हैं, जिनमें से UTF-8, UTF-16 और UTF-32 वर्तमान हैं और कुछ और अप्रचलित हैं।

कृपया, UTF-8 (और साथ ही अन्य सभी एनकोडिंग ) मौजूद हैं और केवल इनपुट या आउटपुट में अर्थ रखते हैं। आंतरिक रूप से, पर्ल 5.8.1 के बाद से, सभी तार यूनिकोड "कोड-पॉइंट" के रूप में रखे गए हैं। सच है, आपको कुछ सुविधाओं को सक्षम करना होगा जो पहले कवर किए गए हैं।


19
मैं मानता हूं कि लोग बहुत बार यूएफ को यूटीएफ -8⧸16 ,32 के साथ भ्रमित करते हैं, लेकिन यह मौलिक और गंभीर रूप से सच नहीं है कि यू some notsᴄɪɪ के सापेक्ष कुछ बढ़े हुए चरित्र है। अधिक से अधिक , यह मात्र ,s‑ 6 10646 से अधिक कुछ नहीं हैU में बहुत अधिक शामिल हैं : समतलीकरण, केसफॉल्डिंग, सामान्यीकरण फ़ॉर्म, ग्रैपहेम क्लस्टर्स, शब्द- और लाइन-ब्रेकिंग, स्क्रिप्ट, न्यूमेरिकल इक्विविज़, चौड़ाई, द्विदिशता, ग्लिफ़ वेरिएंट, प्रासंगिक व्यवहार, स्थान, regexes, संयोजन कक्षाएं, 100 गुण, और के नियम। बहुत अधिक more
tchrist

15
@ टीचर: पहला कदम यह है कि आप अपने प्रोग्राम में और बाहर की दुनिया में बिना ट्रॉशिंग के डेटा प्राप्त करें। फिर आप टकराव, केस फोल्डिंग, ग्लिफ़ वेरिएंट आदि के बारे में चिंता कर सकते हैं।
jrockway

7
मैं मानता हूँ, इनपुट या आउटपुट को कचरा न करना पहली प्राथमिकता होना चाहिए। मैं ऐसा कौन सा मॉड्यूल या प्रैग्मा लेना चाहूंगा जो निम्नलिखित काल्पनिक वार्तालाप को मूर्त रूप दे सके: "- प्रिय पर्ल। इस कार्यक्रम के लिए, सभी इनपुट और आउटपुट विशेष रूप से UTF-8 होंगे। क्या आप कृपया अपना डेटा ट्रैश नहीं कर सकते? - तो केवल यूएफटी -8 आप कहते हैं। क्या आप सुनिश्चित हैं? - हाँ। - वास्तव में, वास्तव में सुनिश्चित करें? - बिल्कुल - और आप स्वीकार करते हैं कि मैं अजीब व्यवहार कर सकता हूं यदि मुझे गैर-यूटीएफ -8 डेटा दिया जाता है? - हां, ठीक है। - ठीक है फिर।"
२२:

10

वहाँ वास्तव में जंगल में प्राचीन कोड की भयावह मात्रा है, आम सीपीएन मॉड्यूल के रूप में इसका बहुत कुछ है। मैंने पाया है कि मुझे यूनिकोड को सक्षम करने में काफी सावधानी बरतनी है अगर मैं बाहरी मॉड्यूल का उपयोग करता हूं जो इससे प्रभावित हो सकता है, और मैं अभी भी कई पर्ल स्क्रिप्ट में यूनिकोड से संबंधित विफलताओं को पहचानने और ठीक करने की कोशिश कर रहा हूं जो मैं नियमित रूप से उपयोग करता हूं (विशेष रूप से, iTiVo विफल रहता है ट्रांसकोडिंग मुद्दों के कारण 7-बिट ASCII नहीं है कि कुछ भी बुरी तरह से)।


मैं -Cयह सुनिश्चित करने के विकल्प का उपयोग कर रहा था कि पर्ल एक ही पृष्ठ पर है क्योंकि मैं यूनिकोड-वार हूं, क्योंकि मेरे पास यह स्पष्ट है कि मैं स्पष्ट रूप से सेटिंग $LANGऔर $LC_ALLठीक से होने के बावजूद यूनिकोड के बजाय आईएसओ 8859/1 का उपयोग करने का निर्णय लेता हूं । (यह वास्तव में प्लेटफ़ॉर्म लोकेल लाइब्रेरीज़ में बग्स को प्रतिबिंबित कर सकता है।) जो कुछ भी है, यह बहुत कष्टप्रद है कि मैं उन पर उच्चारण के साथ कार्यक्रमों पर iTivo का उपयोग नहीं कर सकता, क्योंकि पर्ल स्क्रिप्ट जो काम करते हैं, रूपांतरण त्रुटियों के साथ खत्म हो जाते हैं।
जाइकोसर

3
-Cविकल्पों के बिना एक अकेला छोटी गाड़ी है और त्रुटि-प्रवण है । तुम संसार को तोड़ते हो। PERL5OPTकरने के लिए सक्षम करें -Cऔर आप देखेंगे कि मेरा क्या मतलब है। हमने v5.8 में इस तरह से कोशिश की, और यह एक आपदा थी। आप बस उन कार्यक्रमों को नहीं बता सकते हैं, जो यह उम्मीद नहीं कर रहे हैं कि अब वे यूनिकोड के साथ काम कर रहे हैं या नहीं। सुरक्षा के मुद्दे भी हैं। बहुत कम से कम, कुछ भी जो print while <>बाइनरी डेटा पारित होने पर टूट जाएगा। तो भी सभी डेटाबेस कोड होगा। यह एक भयानक विचार है।
tchrist

1
मैं उदारतापूर्वक बात कर रहा था, वास्तव में, विशेष रूप -Cसे विकल्पों के बिना नहीं । मैं जिस विशिष्ट आह्वान के साथ काम कर रहा था वह था -CSDA। उस ने कहा, मैं 5.8.x के साथ लंबे समय से अटका हुआ था (हेलो मैकपोर्ट्स ...), इसलिए शायद वह इसका हिस्सा था
geekosaur

1
मैं SA पर सेट PERL_UNICODE के साथ दौड़ता हूं। आप नहीं कर सकते यह डी करने के लिए सेट
tchrist

@tchrist: कुछ पर्ल संस्करण पोस्ट -DADA और PERL_UNICODE = SDA उपयोग दिखाते हुए कोड पोस्ट कर रहे हैं । कृपया समुदाय में अपने प्रभाव का उपयोग करें। उसे रोका जाना चाहिए!
एशले

1

आपको यूनिकोड स्ट्रिंग्स सुविधा को सक्षम करना चाहिए, और यदि आप v5.14 का उपयोग करते हैं तो यह डिफ़ॉल्ट है;

आपको वास्तव में यूनिकोड आइडेंटिफ़ायर एस्प का उपयोग नहीं करना चाहिए। utf8 के माध्यम से विदेशी कोड के लिए क्योंकि वे perl5 में असुरक्षित हैं, केवल cperl को यह अधिकार मिला है। उदाहरण देखें http://perl11.org/blog/unicode-identifiers.html

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

BTW: मूस वास्तव में "आधुनिक पर्ल" नहीं है, उन्होंने सिर्फ नाम का अपहरण कर लिया। Moose परिपूर्ण लैरी वॉल-स्टाइल पोस्टमॉडर्न पर्ल है, जो बेज़र्न स्ट्रॉस्ट्रुप-शैली के साथ मिलाया जाता है, जो उचित perl6 सिंटैक्स के एक उदारहण के साथ होता है, जैसे कि चर नामों के लिए स्ट्रिंग्स का उपयोग करना, भयानक ग्राउंड कॉक्स, और एक बहुत ही अपरिपक्व भोली कार्यान्वयन जो 10x धीमा है एक की तुलना में उचित कार्यान्वयन। cperl और perl6 असली आधुनिक पर्ल्स हैं, जहां फॉर्म फंक्शन का अनुसरण करता है, और कार्यान्वयन कम और अनुकूलित होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.