यह कमांड perllocale है जिसे हमारे कई मुफ्त ऑनलाइन वर्कस्टेशन जैसे कि Ubuntu ऑनलाइन, Fedora ऑनलाइन, विंडोज ऑनलाइन एमुलेटर या MAC OS ऑनलाइन एमुलेटर का उपयोग करके OnWorks मुफ्त होस्टिंग प्रदाता में चलाया जा सकता है
कार्यक्रम:
नाम
पर्ललोकेल - पर्ल लोकेल हैंडलिंग (अंतर्राष्ट्रीयकरण और स्थानीयकरण)
वर्णन
शुरुआत में ASCII था, "सूचना के लिए अमेरिकी मानक कोड"
इंटरचेंज", जो अमेरिकियों के लिए उनकी अंग्रेजी वर्णमाला और डॉलर के साथ काफी अच्छी तरह से काम करता है-
लेकिन यह अन्य अंग्रेजी बोलने वालों के लिए भी उतना अच्छा काम नहीं करता, जो
विभिन्न मुद्राओं का उपयोग कर सकते हैं, जैसे पाउंड स्टर्लिंग (उस मुद्रा के प्रतीक के रूप में)
ASCII में नहीं है); और यह दुनिया के हजारों लोगों में से कई के लिए निराशाजनक रूप से अपर्याप्त है
अन्य भाषाएं।
इन कमियों को दूर करने के लिए, लोकल की अवधारणा का आविष्कार किया गया (औपचारिक रूप से आईएसओ सी,
XPG4, POSIX 1.c "स्थानीय प्रणाली")। और ऐसे अनुप्रयोग लिखे गए और लिखे जा रहे हैं जो इसका उपयोग करते हैं
स्थानीय तंत्र। इस तरह के आवेदन को बनाने की प्रक्रिया में इसके
इस प्रकार के मामलों में उपयोगकर्ताओं की प्राथमिकताओं को कहा जाता है अंतर्राष्ट्रीयकरण (अक्सर
संक्षिप्त रूप में i18n); ऐसे एप्लिकेशन को वरीयताओं के एक विशेष सेट के बारे में बताना
जाना जाता है स्थानीयकरण (l10n).
पर्ल को स्थानीय सिस्टम का समर्थन करने के लिए विस्तारित किया गया है। इसे प्रति एप्लिकेशन नियंत्रित किया जाता है
एक प्रग्मा, एक फ़ंक्शन कॉल और कई पर्यावरण चर का उपयोग करके।
दुर्भाग्य से, डिज़ाइन में कुछ कमियाँ हैं (और अक्सर,
कार्यान्वयन) स्थानीयकरण। यूनिकोड का आविष्कार किया गया था (परिचय के लिए perlunitut देखें
कि) आंशिक रूप से इन डिज़ाइन की कमियों को दूर करने के लिए, और आजकल, एक श्रृंखला है
"UTF-8 लोकल", यूनिकोड पर आधारित। ये वे लोकल हैं जिनका वर्ण सेट यूनिकोड है,
UTF-8 में एनकोडेड। v5.20 से शुरू होकर, Perl UTF-8 लोकल को पूरी तरह से सपोर्ट करता है, सिवाय इसके कि
सॉर्टिंग और स्ट्रिंग तुलना। (इनके लिए Unicode::Collate का उपयोग करें।) Perl जारी है
पुराने गैर UTF-8 लोकल का भी समर्थन करें। वर्तमान में कोई UTF-8 लोकल नहीं है
ईबीसीडीआईसी प्लेटफॉर्म।
(यूनिकोड "सीएलडीआर", "कॉमन लोकेल डेटा रिपोजिटरी" भी बना रहा है,
<http://cldr.unicode.org/> जिसमें उपलब्ध जानकारी से अधिक प्रकार की जानकारी शामिल है
POSIX लोकेल सिस्टम। इस लेखन के समय, कोई CPAN मॉड्यूल नहीं था जो
इस XML-एन्कोडेड डेटा तक पहुँच प्रदान करता है। हालाँकि, इसके कई लोकेल में POSIX-
केवल निकाला गया डेटा, और UTF-8 लोकल के रूप में उपलब्ध है
<http://unicode.org/Public/cldr/latest/>.)
क्या बात IS A स्थानीय
लोकेल डेटा का एक सेट है जो विभिन्न समुदायों के विभिन्न पहलुओं का वर्णन करता है
दुनिया भर के लोग अपनी दुनिया को वर्गीकृत करते हैं। इन श्रेणियों को निम्नलिखित प्रकारों में विभाजित किया गया है
(जिनमें से कुछ का संक्षिप्त विवरण यहां दिया गया है):
श्रेणी "LC_NUMERIC": संख्यात्मक स्वरूपण
यह इंगित करता है कि संख्याओं को मानवीय पठनीयता के लिए किस प्रकार प्रारूपित किया जाना चाहिए, उदाहरण के लिए
दशमलव बिंदु के रूप में प्रयुक्त वर्ण।
श्रेणी "LC_MONETARY": मौद्रिक राशियों का प्रारूपण
श्रेणी "LC_TIME": दिनांक/समय स्वरूपण
श्रेणी "LC_MESSAGES": त्रुटि और अन्य संदेश
इसका उपयोग पर्ल द्वारा केवल $! के माध्यम से ऑपरेटिंग सिस्टम त्रुटि संदेशों तक पहुंचने के लिए किया जाता है।
और $^E.
श्रेणी "LC_COLLATE": मिलान
यह तुलना और छंटाई के लिए अक्षरों के क्रम को इंगित करता है। लैटिन में
उदाहरण के लिए, "b", आमतौर पर "a" के बाद आता है।
श्रेणी "LC_CTYPE": वर्ण प्रकार
उदाहरण के लिए, इससे यह पता चलता है कि कोई वर्ण बड़ा अक्षर है या नहीं।
अन्य श्रेणियां
कुछ प्लेटफ़ॉर्म पर अन्य श्रेणियाँ भी होती हैं, जो मापन इकाइयों जैसी चीज़ों से निपटती हैं
और कागज़ के आकार। इनमें से कोई भी सीधे पर्ल द्वारा उपयोग नहीं किया जाता है, लेकिन बाहरी संचालन जो
पर्ल इनका उपयोग कर सकता है। नीचे "उपयोग लोकेल" के दायरे में नहीं" देखें।
पर्ल द्वारा प्रयुक्त श्रेणियों के बारे में अधिक विवरण नीचे "स्थानीय श्रेणियाँ" में दिए गए हैं।
साथ में, ये श्रेणियां एक एकल कार्यक्रम को अनुकूलित करने में सक्षम होने की दिशा में एक लंबा रास्ता तय करती हैं
कई अलग-अलग स्थानों पर चलाने के लिए। लेकिन इसमें कुछ कमियाँ हैं, इसलिए पढ़ते रहें।
तैयार कर रहे हैं सेवा मेरे उपयोग स्थानों
पर्ल स्वयं (POSIX मॉड्यूल के बाहर) तब तक लोकल का उपयोग नहीं करेगा जब तक कि विशेष रूप से अनुरोध न किया जाए
(लेकिन फिर से ध्यान दें कि पर्ल उन कोड के साथ बातचीत कर सकता है जो उनका उपयोग करता है)। भले ही वहाँ है
ऐसा अनुरोध, सब इसके ठीक से काम करने के लिए निम्न में से कोई एक सत्य होना चाहिए:
· आपका परिचालन प्रणाली चाहिए समर्थन la स्थानीय प्रणालीयदि ऐसा है, तो आपको पता चल जाएगा
"setlocale()" फ़ंक्शन इसकी C लाइब्रेरी का एक प्रलेखित भाग है।
· परिभाषाएँ एसटी स्थानीय कि इसलिए आप उपयोग चाहिए be installed. आप, या आपका सिस्टम
व्यवस्थापक को यह सुनिश्चित करना होगा कि यह मामला ऐसा ही है। उपलब्ध स्थानीयकरण,
उन्हें जिस स्थान पर रखा जाता है और जिस तरीके से उन्हें स्थापित किया जाता है, वे सभी अलग-अलग होते हैं
सिस्टम से सिस्टम तक। कुछ सिस्टम केवल कुछ ही हार्ड-वायर्ड लोकल प्रदान करते हैं और
और अधिक जोड़ने की अनुमति दें। अन्य आपको द्वारा प्रदान की गई "डिब्बाबंद" लोकल जोड़ने की अनुमति देते हैं
सिस्टम आपूर्तिकर्ता। फिर भी अन्य आपको या सिस्टम प्रशासक को परिभाषित करने और जोड़ने की अनुमति देते हैं
मनमाने स्थान। (आपको अपने आपूर्तिकर्ता से डिब्बाबंद स्थान उपलब्ध कराने के लिए कहना पड़ सकता है
आपके ऑपरेटिंग सिस्टम के साथ डिलीवर नहीं किए जाते हैं।) इसके लिए अपने सिस्टम का दस्तावेज़ पढ़ें
आगे की रोशनी.
· पर्ल चाहिए मानना कि la स्थानीय प्रणाली is समर्थित. यदि ऐसा होता है, तो "पर्ल
-V:d_setlocale" यह बताएगा कि "d_setlocale" का मान "define" है।
यदि आप चाहते हैं कि पर्ल एप्लीकेशन आपके डेटा को किसी विशेष विधि के अनुसार प्रोसेस और प्रस्तुत करे
locale, एप्लिकेशन कोड में "use locale" प्रैग्मा शामिल होना चाहिए (देखें "use locale"
प्रग्मा") जहां उपयुक्त हो, और at कम से कम एक निम्नलिखित में से कोई एक सत्य होना चाहिए:
1. RSI स्थान निर्धारण वातावरण चर (देखें "पर्यावरण") चाहिए be ठीक प्रकार से सेट
up एप्लिकेशन शुरू होने के समय, या तो आपके द्वारा या जिसने भी इसे सेट किया है उसके द्वारा
आपका सिस्टम खाता; या
2. RSI आवेदन चाहिए सेट इसके अपना स्थानीय "सेटलोकेल" में वर्णित विधि का उपयोग करना
समारोह"।
का उपयोग करते हुए स्थानों
RSI "उपयोग लोकेल" pragma
डिफ़ॉल्ट रूप से, पर्ल स्वयं (POSIX मॉड्यूल के बाहर) वर्तमान लोकेल को अनदेखा करता है।
"यूज़ लोकेल" प्रैग्मा पर्ल को कुछ ऑपरेशन के लिए वर्तमान लोकेल का उपयोग करने के लिए कहता है।
v5.16, इस प्रैग्मा के लिए वैकल्पिक पैरामीटर हैं, जिनका वर्णन नीचे किया गया है, जो प्रतिबंधित करते हैं
इससे परिचालन प्रभावित होता है।
वर्तमान लोकेल निष्पादन समय पर सेट किया जाता है सेटलोकेल () नीचे वर्णित है। यदि वह
प्रोग्राम के निष्पादन के दौरान फ़ंक्शन को अभी तक नहीं बुलाया गया है, वर्तमान
स्थानीय भाषा वह है जो कार्यक्रम के आरंभ में प्रभावी "पर्यावरण" द्वारा निर्धारित की गई थी।
कार्यक्रम। यदि कोई वैध वातावरण नहीं है, तो वर्तमान लोकेल वह है जो सिस्टम
डिफ़ॉल्ट को सेट किया गया है। POSIX सिस्टम पर, यह संभव है, लेकिन जरूरी नहीं कि, "C"
स्थानीय भाषा। विंडोज़ पर, डिफ़ॉल्ट को कंप्यूटर के माध्यम से सेट किया जाता है
"कंट्रोल पैनल->क्षेत्रीय और भाषा विकल्प" (या इसके वर्तमान समतुल्य).
स्थानीय भाषा से प्रभावित होने वाले कार्य इस प्रकार हैं:
नहीं अंदर la क्षेत्र of "उपयोग लोकेल"
केवल पर्ल के बाहर उत्पन्न होने वाले कुछ ही ऑपरेशन प्रभावित होंगे, निम्नानुसार:
· वर्तमान लोकेल का उपयोग पर्ल के बाहर जाने पर किया जाता है जैसे कि
प्रणाली () या qx//, यदि वे ऑपरेशन स्थानीय-संवेदनशील हैं।
· इसके अलावा Perl POSIX मॉड्यूल के माध्यम से विभिन्न C लाइब्रेरी फ़ंक्शनों तक पहुंच प्रदान करता है।
इनमें से कुछ फ़ंक्शन हमेशा मौजूदा लोकेल से प्रभावित होते हैं। उदाहरण के लिए,
"POSIX::strftime()" "LC_TIME" का उपयोग करता है; "POSIX::strtod()" "LC_NUMERIC" का उपयोग करता है;
"POSIX::strcoll()" और "POSIX::strxfrm()" "LC_COLLATE" का उपयोग करते हैं; और वर्ण
"POSIX::isalnum()" जैसे वर्गीकरण फ़ंक्शन "LC_CTYPE" का उपयोग करते हैं। ऐसे सभी
फ़ंक्शन वर्तमान अंतर्निहित लोकेल के अनुसार व्यवहार करेंगे, भले ही वह
लोकेल पर्ल स्पेस के संपर्क में नहीं है।
· "LC_NUMERIC" को छोड़कर सभी श्रेणियों के लिए XS मॉड्यूल अंतर्निहित लोकेल प्राप्त करते हैं, और
इसलिए वे जो भी C लाइब्रेरी फ़ंक्शन कॉल करेंगे, वे उस अंतर्निहित लोकेल का उपयोग करेंगे। अधिक जानकारी के लिए
चर्चा के लिए, perlxs में "चेतावनी" देखें।
ध्यान दें कि सभी C प्रोग्राम (जिसमें perl इंटरप्रेटर भी शामिल है, जो C में लिखा गया है)
हमेशा एक अंतर्निहित लोकेल होता है। वह लोकेल "C" लोकेल है जब तक कि उसे किसी द्वारा परिवर्तित न किया जाए
कॉल करने के लिए सेटलोकेल ()जब पर्ल शुरू होता है, तो यह अंतर्निहित लोकेल को एक में बदल देता है
जिसे "पर्यावरण" द्वारा दर्शाया जाता है। POSIX मॉड्यूल का उपयोग करते समय या XS लिखते समय
कोड में, यह ध्यान रखना महत्वपूर्ण है कि अंतर्निहित लोकेल कुछ ऐसा हो सकता है
"सी" के अलावा, भले ही प्रोग्राम ने इसे स्पष्ट रूप से परिवर्तित नहीं किया हो।
सुस्त प्रभाव of "उपयोग लोकेल"
कुछ पर्ल ऑपरेशन जो "उपयोग लोकेल" के दायरे में स्थापित किए जाते हैं, वे इसे बनाए रखते हैं
दायरे से बाहर भी प्रभाव। इनमें शामिल हैं:
· आउटपुट स्वरूप लिखो() पहले के प्रारूप घोषणा द्वारा निर्धारित किया जाता है
(perlfunc में "फ़ॉर्मेट"), इसलिए आउटपुट लोकेल से प्रभावित होता है या नहीं, यह इस पर निर्भर करता है
यह इस बात से निर्धारित होता है कि क्या "format()" "उपयोग लोकेल" के दायरे में है, न कि इस बात से कि क्या
"write()" है.
· नियमित अभिव्यक्ति पैटर्न को वास्तविक मिलान के साथ qr// का उपयोग करके संकलित किया जा सकता है
बाद में टाल दिया गया। फिर से, यह इस बात पर निर्भर करता है कि संकलन समय-सीमा के भीतर किया गया था या नहीं
"स्थानीय भाषा का उपयोग करें" का दायरा मिलान व्यवहार को निर्धारित करता है, न कि मिलान होने पर
क्या कार्य ऐसे दायरे में किए जाते हैं या नहीं।
के अंतर्गत ""उपयोग लोकेल";"
· उपरोक्त सभी कार्य
· प्रारूप घोषणाओं (perlfunc में "format") और इसलिए बाद में किसी भी "write()" का उपयोग
"एलसी_न्यूमेरिक".
· स्ट्रिंगीकरण और उत्पादन "LC_NUMERIC" का उपयोग करें। इनमें निम्नलिखित परिणाम शामिल हैं
"print()", "printf()", "say()", और "sprintf()"।
· RSI तुलना ऑपरेटरों ("lt", "le", "cmp", "ge", और "gt") "LC_COLLATE" का उपयोग करते हैं।
"सॉर्ट()" भी प्रभावित होता है यदि इसका उपयोग स्पष्ट तुलना फ़ंक्शन के बिना किया जाता है, क्योंकि
यह डिफ़ॉल्ट रूप से "cmp" का उपयोग करता है।
नोट: "eq" और "ne" स्थानीय भाषा से अप्रभावित रहते हैं: वे हमेशा वर्ण-दर-वर्ण क्रम निष्पादित करते हैं
उनके स्केलर ऑपरेंड की तुलना। इसके अलावा, अगर "cmp" पाता है कि उसके
ऑपरेंड वर्तमान द्वारा निर्दिष्ट कोलेशन अनुक्रम के अनुसार बराबर हैं
लोकेल, यह अक्षर-दर-अक्षर तुलना करता है, और केवल लौटाता है 0
(बराबर) अगर ऑपरेंड अक्षर-दर-अक्षर समान हैं। अगर आप वाकई जानना चाहते हैं
क्या दो स्ट्रिंग्स - जिन्हें "eq" और "cmp" अलग-अलग मान सकते हैं - बराबर हैं
जहाँ तक स्थानीय भाषा में मिलान का सवाल है, "श्रेणी" में चर्चा देखें
"LC_COLLATE": मिलान".
· नियमित भाव और केस-संशोधन कार्यों ("यूसी()", "एलसी()", "यूसीफर्स्ट()",
और "lcfirst()") "LC_CTYPE" का उपयोग करें
· RSI चर $! (और इसके समानार्थी शब्द $ERRNO और $OS_ERROR) और $^ई (और इसका पर्यायवाची
$EXTENDED_OS_ERROR) को स्ट्रिंग के रूप में उपयोग करने पर "LC_MESSAGES" का उपयोग करें।
डिफ़ॉल्ट व्यवहार "कोई स्थानीयकरण नहीं" प्रैग्मा के साथ, या अंत तक पहुंचने पर बहाल किया जाता है
"यूज़ लोकेल" को संलग्न करने वाला ब्लॉक। ध्यान दें कि "यूज़ लोकेल" कॉल नेस्टेड हो सकते हैं, और यह कि
आंतरिक दायरे में जो प्रभावी है वह अंत में बाहरी दायरे के नियमों पर वापस लौट जाएगा
आंतरिक दायरे का.
स्थानीय जानकारी का उपयोग करने वाले किसी भी ऑपरेशन का स्ट्रिंग परिणाम दूषित होता है, क्योंकि यह
किसी स्थान का अविश्वसनीय होना संभव है। "सुरक्षा" देखें।
Perl v5.16 में बहुत सीमित तरीके से, और अधिक सामान्यतः v5.22 में, आप कर सकते हैं
इस विशेष उदाहरण द्वारा कौन सी श्रेणी या श्रेणियां सक्षम की जाएं, इसे प्रतिबंधित करें
pragma में पैरामीटर जोड़कर। उदाहरण के लिए,
लोकेल qw(:ctype :numeric) का उपयोग करें;
यह केवल उन परिचालनों (ऊपर सूचीबद्ध) के दायरे में स्थानीय जागरूकता को सक्षम बनाता है जो
"LC_CTYPE" और "LC_NUMERIC" से प्रभावित.
संभावित श्रेणियाँ हैं: ":collate", ":ctype", ":messages", ":monetary", ":numeric",
":time", और छद्म श्रेणी ":characters" (नीचे वर्णित).
इस प्रकार आप कह सकते हैं
लोकेल ':messages' का उपयोग करें;
और केवल $! और $^E ही स्थानीय भाषा के प्रति जागरूक होंगे। बाकी सब कुछ अप्रभावित रहेगा।
चूंकि पर्ल वर्तमान में "LC_MONETARY" श्रेणी के साथ कुछ नहीं करता है, इसलिए निर्दिष्ट करना
":monetary" प्रभावी रूप से कुछ नहीं करता। कुछ प्रणालियों में अन्य श्रेणियाँ होती हैं, जैसे
"LC_PAPER_SIZE", लेकिन पर्ल को भी उनके बारे में कुछ नहीं पता है, और ऐसा करने का कोई तरीका भी नहीं है
उन्हें इस प्रगामा के तर्कों में निर्दिष्ट करें।
आप आसानी से यह भी कह सकते हैं कि एक को छोड़कर सभी श्रेणियों का उपयोग करें, उदाहरण के लिए,
लोकेल ':!ctype' का उपयोग करें;
लोकेल ': not_ctype' का उपयोग करें;
दोनों का मतलब है "LC_CTYPE" को छोड़कर सभी श्रेणियों की स्थानीय जागरूकता को सक्षम करना। केवल एक
श्रेणी तर्क को "उपयोग लोकेल" में निर्दिष्ट किया जा सकता है यदि यह नकारात्मक रूप का है।
v5.22 से पहले तर्कों के साथ प्रैग्मा का केवल एक ही रूप उपलब्ध है:
लोकेल का उपयोग करें ':not_characters';
(और आपको "नहीं_" कहना होगा; आप धमाकेदार "!" फॉर्म का उपयोग नहीं कर सकते हैं)। यह छद्म श्रेणी एक है
":collate" और ":ctype" दोनों को निर्दिष्ट करने के लिए संक्षिप्त रूप। इसलिए, नकारात्मक रूप में, यह है
लगभग वैसी ही बात कहना
लोकेल qw(:संदेश :मौद्रिक :संख्यात्मक :समय) का उपयोग करें;
हम "लगभग" शब्द का प्रयोग करते हैं, क्योंकि ":not_characters" भी चालू होता है
"इसके दायरे में 'यूनिकोड_स्ट्रिंग्स' सुविधा का उपयोग करें"। यह फ़ॉर्म v5.20 में कम उपयोगी है और
बाद में, और "यूनिकोड और यूटीएफ-8" में इसका पूरा वर्णन किया गया है, लेकिन संक्षेप में, यह पर्ल को ऐसा न करने के लिए कहता है
स्थानीय परिभाषा के वर्ण भागों का उपयोग करें, जो कि "LC_CTYPE" है और
"LC_COLLATE" श्रेणियाँ। इसके बजाय यह मूल वर्ण सेट (द्वारा विस्तारित) का उपयोग करेगा
यूनिकोड)। इस पैरामीटर का उपयोग करते समय, आप बाहरी जानकारी प्राप्त करने के लिए जिम्मेदार हैं
वर्ण सेट को मूल/यूनिकोड में अनुवादित किया गया है (यदि यह पहले से ही है तो यह मूल/यूनिकोड में होगा)
तेजी से लोकप्रिय हो रहे UTF-8 लोकल में से एक)। ऐसा करने के कई सुविधाजनक तरीके हैं,
जैसा कि "यूनिकोड और UTF-8" में वर्णित है।
RSI सेटलोकेल समारोह
आप "POSIX::setlocale()" के साथ रन टाइम पर जितनी बार चाहें उतनी बार लोकल स्विच कर सकते हैं
समारोह:
# POSIX मॉड्यूल से लोकेल-हैंडलिंग टूल सेट आयात करें।
# यह उदाहरण उपयोग करता है: setlocale -- फ़ंक्शन कॉल
# LC_CTYPE -- नीचे समझाया गया
# (संचालन की सफलता/असफलता के लिए परीक्षण दिखाया जा रहा है)
# मुख्य बात से ध्यान हटाने के लिए इन उदाहरणों में इसे छोड़ दिया गया है
# बिंदु)
POSIX qw(locale_h) का उपयोग करें;
स्थानीय भाषा का उपयोग करें;
मेरा $old_locale;
# पुरानी लोकेल क्वेरी करें और सेव करें
$old_locale = सेटलोकेल(LC_CTYPE);
सेटलोकेल(LC_CTYPE, "fr_CA.ISO8859-1");
# LC_CTYPE अब लोकेल "फ्रेंच, कनाडा, कोडसेट ISO 8859-1" में है
सेटलोकेल(LC_CTYPE, "");
# LC_CTYPE अब द्वारा परिभाषित डिफ़ॉल्ट पर रीसेट हो गया है
# LC_ALL/LC_CTYPE/LANG पर्यावरण चर, या सिस्टम के लिए
# डिफ़ॉल्ट. दस्तावेज़ के लिए नीचे देखें.
# पुराने लोकेल को पुनर्स्थापित करें
सेटलोकेल(LC_CTYPE, $old_locale);
यह प्रोग्राम के सभी थ्रेड्स को एक साथ प्रभावित करता है, इसलिए इसका उपयोग करना समस्याग्रस्त हो सकता है
थ्रेडेड अनुप्रयोगों में स्थानीयकरण को छोड़कर, जहाँ सभी के लिए एक ही स्थानीयकरण लागू होता है
धागे।
"setlocale()" का पहला तर्क देता है वर्ग, दूसरा स्थानीय।
श्रेणी यह बताती है कि डेटा प्रोसेसिंग के किस पहलू में आप स्थानीय-विशिष्ट नियम लागू करना चाहते हैं।
श्रेणी के नामों पर "स्थानीय श्रेणियाँ" और "पर्यावरण" में चर्चा की गई है। स्थानीय भाषा वह है जो स्थानीय भाषा में लिखी जाती है।
किसी विशेष से संबंधित अनुकूलन जानकारी के संग्रह का नाम
भाषा, देश या क्षेत्र और कोडसेट का संयोजन। संकेतों के लिए आगे पढ़ें
स्थानीयकरण का नामकरण: सभी प्रणालियाँ स्थानीयकरण का नामकरण उदाहरण के अनुसार नहीं करतीं।
यदि कोई दूसरा तर्क नहीं दिया गया है और श्रेणी "LC_ALL" के अलावा कुछ और है, तो
फ़ंक्शन श्रेणी के लिए वर्तमान लोकेल का नाम देने वाली एक स्ट्रिंग लौटाता है। आप इसका उपयोग कर सकते हैं
"setlocale()" के लिए आगामी कॉल में दूसरे तर्क के रूप में value, लेकिन कुछ प्लेटफॉर्म पर
स्ट्रिंग अपारदर्शी है, ऐसा कुछ नहीं है जिसे ज्यादातर लोग समझ पाएंगे कि क्या है
इसका मतलब है स्थानीय भाषा.
यदि कोई दूसरा तर्क नहीं दिया गया है और श्रेणी "LC_ALL" है, तो परिणाम है
कार्यान्वयन पर निर्भर। यह संयोजित स्थानीय नामों की एक स्ट्रिंग हो सकती है (विभाजक भी
कार्यान्वयन-निर्भर) या एकल स्थानीय नाम। कृपया अपने सेटलोकेल(3) मनुष्य
जानकारी के लिए पृष्ठ.
यदि दूसरा तर्क दिया गया है और यह एक वैध लोकेल से मेल खाता है, तो लोकेल
श्रेणी को उस मान पर सेट किया जाता है, और फ़ंक्शन वर्तमान स्थानीय मान लौटाता है।
फिर इसे "setlocale()" के लिए एक और कॉल में उपयोग कर सकते हैं। (कुछ कार्यान्वयन में,
वापसी मान कभी-कभी आपके द्वारा दूसरे तर्क के रूप में दिए गए मान से भिन्न हो सकता है - इस पर विचार करें
इसे आपके द्वारा दिए गए मान के लिए एक उपनाम के रूप में उपयोग करें।)
जैसा कि उदाहरण से पता चलता है, यदि दूसरा तर्क एक रिक्त स्ट्रिंग है, तो श्रेणी का लोकेल है
संबंधित पर्यावरण चर द्वारा निर्दिष्ट डिफ़ॉल्ट पर वापस आ जाता है। आम तौर पर,
इसका परिणाम यह होता है कि पर्ल के शुरू होने पर जो डिफ़ॉल्ट लागू था, वह वापस आ जाता है: इसमें परिवर्तन
स्टार्टअप के बाद एप्लिकेशन द्वारा बनाया गया वातावरण ध्यान में आ सकता है या नहीं, यह इस बात पर निर्भर करता है
आपके सिस्टम की C लाइब्रेरी पर.
ध्यान दें कि जब "स्थानीय भाषा का उपयोग करें" का ऐसा स्वरूप निर्दिष्ट किया जाता है जिसमें सभी श्रेणियां शामिल नहीं होती हैं,
पर्ल बहिष्कृत श्रेणियों की उपेक्षा करता है।
यदि "set_locale()" किसी कारण से विफल हो जाता है (उदाहरण के लिए, किसी लोकेल पर सेट करने का प्रयास
सिस्टम के लिए अज्ञात), श्रेणी के लिए लोकेल नहीं बदला जाता है, और फ़ंक्शन
"undef" लौटाता है.
श्रेणियों के बारे में अधिक जानकारी के लिए, परामर्श लें सेटलोकेल(3).
खोज स्थानीय
आपके सिस्टम में उपलब्ध स्थानों के लिए, यह भी देखें सेटलोकेल(3) यह देखने के लिए कि क्या इससे कोई परिणाम निकलता है
उपलब्ध स्थानों की सूची (खोजें) देख ALSO अनुभाग) यदि वह विफल हो जाए, तो प्रयास करें
निम्नलिखित कमांड लाइन:
लोकेल-ए
एनएलएसइन्फो
एलएस /usr/lib/nls/loc
ls /usr/lib/locale
एलएस /usr/lib/nls
ls /usr/शेयर/लोकेल
और देखें कि क्या वे इनसे मिलती-जुलती कोई सूची बनाते हैं
en_US.ISO8859-1 de_DE.ISO8859-1 ru_RU.ISO8859-5
en_US.iso88591 de_DE.iso88591 ru_RU.iso88595
en_US de_DE ru_RU
hi डे रु
अंग्रेज़ी जर्मन रूसी
अंग्रेज़ी.iso88591 जर्मन.iso88591 रूसी.iso88595
english.roman8 रूसी.koi8r
दुःख की बात है कि, भले ही "setlocale()" के लिए कॉलिंग इंटरफ़ेस को मानकीकृत कर दिया गया है, फिर भी इसके नाम
स्थानीयकरण और निर्देशिकाएँ जहाँ कॉन्फ़िगरेशन रहता है, नहीं किया गया है। मूल रूप
नाम का है भाषा_क्षेत्र.कोडसेट, लेकिन बाद के भागों के बाद भाषा नहीं कर रहे हैं
हमेशा मौजूद. भाषा और देश आम तौर पर मानकों से होते हैं आईएसओ 3166 और आईएसओ
639, दुनिया के देशों और भाषाओं के लिए दो-अक्षर के संक्षिप्त रूप,
क्रमशः। कोडसेट भाग में अक्सर कुछ का उल्लेख होता है आईएसओ 8859 वर्ण सेट, लैटिन
कोडसेट। उदाहरण के लिए, "आईएसओ 8859-1" तथाकथित "पश्चिमी यूरोपीय कोडसेट" है जो
अधिकांश पश्चिमी यूरोपीय भाषाओं को पर्याप्त रूप से एनकोड करने के लिए उपयोग किया जा सकता है। फिर से, कई हैं
उस एक मानक का नाम भी लिखने के कई तरीके हैं। अफसोस की बात है।
दो विशेष लोकेल विशेष रूप से उल्लेखनीय हैं: "C" और "POSIX"। वर्तमान में ये हैं
प्रभावी रूप से एक ही लोकेल: अंतर मुख्य रूप से यह है कि पहला द्वारा परिभाषित किया गया है
C मानक, POSIX मानक द्वारा दूसरा। वे परिभाषित करते हैं चूक स्थानीय जिसमें
प्रत्येक प्रोग्राम अपने वातावरण में स्थानीय जानकारी के अभाव में शुरू होता है।
चूक डिफ़ॉल्ट लोकेल, यदि आप चाहें तो।) इसकी भाषा (अमेरिकी) अंग्रेजी है और इसकी
वर्ण कोडसेट ASCII या, कभी-कभी, उसका सुपरसेट (जैसे "DEC मल्टीनेशनल"
कैरेक्टर सेट (डीईसी-एमसीएस)"). चेतावनी.कुछ विक्रेताओं द्वारा वितरित सी लोकेल शायद न हो
वास्तव में सी मानक के अनुसार बिल्कुल मेल नहीं खाता। इसलिए सावधान रहें।
ध्यान दें: सभी प्रणालियों में "POSIX" लोकेल नहीं होता (सभी प्रणालियाँ POSIX-अनुरूप नहीं होतीं), इसलिए
जब आपको इस डिफ़ॉल्ट लोकेल को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता हो तो "C" का उपयोग करें।
स्थानीय समस्याओं
पर्ल स्टार्टअप पर आपको निम्नलिखित चेतावनी संदेश मिल सकता है:
पर्ल: चेतावनी: स्थान सेटिंग विफल रही।
पर्ल: चेतावनी: कृपया जांचें कि आपकी स्थानीय सेटिंग:
LC_ALL = "En_US",
लैंग = (असेट)
आपके सिस्टम पर समर्थित और स्थापित हैं।
पर्ल: चेतावनी: मानक स्थान पर वापस आना ("सी")।
इसका मतलब यह है कि आपकी स्थानीय सेटिंग में "LC_ALL" को "En_US" पर सेट किया गया है और LANG मौजूद है, लेकिन
कोई मूल्य नहीं। पर्ल ने आप पर विश्वास करने की कोशिश की लेकिन वह ऐसा नहीं कर सका। इसके बजाय, पर्ल ने हार मान ली और पीछे हट गया
"सी" लोकेल पर, डिफ़ॉल्ट लोकेल जो किसी भी स्थिति में काम करना चाहिए। (ऑन)
विंडोज़ में, यह सबसे पहले सिस्टम डिफ़ॉल्ट लोकेल पर वापस जाने की कोशिश करता है।) इसका आमतौर पर मतलब होता है
आपकी स्थानीय सेटिंग गलत थी, उनमें ऐसे स्थानीय स्थानों का उल्लेख है जिनके बारे में आपके सिस्टम ने कभी नहीं सुना है, या
आपके सिस्टम में लोकेल इंस्टॉलेशन में समस्याएँ हैं (उदाहरण के लिए, कुछ सिस्टम फ़ाइलें
टूटा हुआ या गायब)। इन समस्याओं के त्वरित और अस्थायी समाधान हैं, साथ ही साथ
अधिक गहन और स्थायी समाधान.
परीक्षण एसटी टूटा हुआ स्थानीय
यदि आप स्रोत से Perl का निर्माण कर रहे हैं, तो Perl परीक्षण सूट फ़ाइल लिब/लोकेल.टी करने के लिए इस्तेमाल किया जा सकता है
अपने सिस्टम पर लोकल का परीक्षण करें। पर्यावरण चर "PERL_DEBUG_FULL_TEST" सेट करना
1 पर सेट करने से यह विस्तृत परिणाम आउटपुट करेगा। उदाहरण के लिए, लिनक्स पर, आप कह सकते हैं
PERL_DEBUG_FULL_TEST=1 ./perl -T -Ilib lib/locale.t > locale.log 2>&1
कई अन्य परीक्षणों के अलावा, यह आपके सिस्टम पर पाए जाने वाले प्रत्येक लोकेल का परीक्षण करेगा, यह देखने के लिए कि क्या वे
POSIX मानक के अनुरूप। यदि कोई त्रुटि है, तो अंत में एक सारांश शामिल होगा
किस लोकेल ने सभी परीक्षण पास किए, कौन से असफल रहे, और क्यों।
अस्थायी रूप से फिक्सिंग स्थानीय समस्याओं
दो सबसे त्वरित समाधान हैं या तो पर्ल को किसी भी स्थानीय असंगतता के बारे में चुप करा देना
या डिफ़ॉल्ट लोकेल "C" के अंतर्गत Perl चलाने के लिए।
स्थानीय समस्याओं के बारे में पर्ल की शिकायत को पर्यावरण चर सेट करके शांत किया जा सकता है
"PERL_BADLANG" को "0" या "" में बदलें। यह विधि वास्तव में समस्या को दबा देती है:
आप पर्ल को चुप रहने के लिए कहते हैं, भले ही पर्ल को लगे कि कुछ गड़बड़ है। हैरान मत होइए
यदि बाद में कोई स्थान-आधारित चीज़ गलत व्यवहार करती है।
पर्ल को "C" लोकेल के अंतर्गत पर्यावरण चर "LC_ALL" को "C" पर सेट करके चलाया जा सकता है।
यह विधि शायद "PERL_BADLANG" दृष्टिकोण की तुलना में थोड़ी अधिक सभ्य है, लेकिन सेटिंग
"LC_ALL" (या अन्य स्थानीय चर) केवल Perl ही नहीं, बल्कि अन्य प्रोग्रामों को भी प्रभावित कर सकते हैं।
विशेष रूप से, Perl के अंदर से चलाए जाने वाले बाहरी प्रोग्राम में ये परिवर्तन दिखाई देंगे। यदि आप
नई सेटिंग स्थायी (पढ़ें आगे), आपके द्वारा चलाए जाने वाले सभी प्रोग्राम में परिवर्तन दिखाई देंगे। देखें
प्रासंगिक पर्यावरण चरों की पूरी सूची के लिए "पर्यावरण" और "स्थानीय चरों का उपयोग करना"
पर्ल में उनके प्रभाव। अन्य प्रोग्रामों में प्रभाव आसानी से अनुमान लगाने योग्य हैं। उदाहरण के लिए,
चर "LC_COLLATE" आपके को अच्छी तरह से प्रभावित कर सकता है तरह कार्यक्रम (या जो भी कार्यक्रम हो)
आपके सिस्टम में "रिकॉर्ड्स" को वर्णानुक्रम में व्यवस्थित करने को कहा जाता है)।
आप इन चरों को अस्थायी रूप से बदलकर परीक्षण कर सकते हैं, और यदि नई सेटिंग्स ठीक लगती हैं
मदद, उन सेटिंग्स को अपनी शेल स्टार्टअप फ़ाइलों में डालें। अपने स्थानीय दस्तावेज़ देखें
सटीक विवरण के लिए. बॉर्न-जैसे गोले के लिए (sh, क्ष, खूब जोर से पीटना, zsh):
LC_ALL=en_US.ISO8859-1
LC_ALL निर्यात करें
यह मान लिया गया है कि हमने ऊपर चर्चित कमांड का उपयोग करके "en_US.ISO8859-1" लोकेल देखा है।
हमने उपरोक्त दोषपूर्ण लोकेल "En_US" के स्थान पर इसे आज़माने का निर्णय लिया - और वह भी Cshish शैल में
(csh, tcsh)
setenv LC_ALL en_US.ISO8859-1
या यदि आपके पास "env" एप्लिकेशन है तो आप ऐसा कर सकते हैं (किसी भी शेल में)
env LC_ALL=en_US.ISO8859-1 पर्ल ...
यदि आपको नहीं पता कि आपके पास कौन सा शेल है, तो अपने स्थानीय हेल्पडेस्क या समकक्ष से परामर्श लें।
स्थायी रूप से फिक्सिंग स्थानीय समस्याओं
धीमे लेकिन बेहतर समाधान तब होते हैं जब आप स्वयं समस्या को ठीक करने में सक्षम हो सकते हैं।
अपने स्वयं के पर्यावरण चर का गलत विन्यास।
संपूर्ण सिस्टम के स्थानीयकरण के लिए आमतौर पर आपके अनुकूल सिस्टम प्रशासक की सहायता की आवश्यकता होती है।
सबसे पहले, इस दस्तावेज़ में पहले "स्थानीय स्थान ढूँढना" के बारे में देखें। यह बताता है कि कौन सा स्थान ढूँढना है
आपके सिस्टम पर स्थानीय भाषाएँ वास्तव में समर्थित हैं - और सबसे महत्वपूर्ण बात, वे इंस्टॉल हैं।
उदाहरण त्रुटि संदेश, स्थानीय भाषा को प्रभावित करने वाले पर्यावरण चर क्रम में सूचीबद्ध हैं
घटती हुई महत्ता (और अनसेट चर मायने नहीं रखते)। इसलिए, LC_ALL होने पर
"En_US" पर सेट करना गलत विकल्प रहा होगा, जैसा कि त्रुटि संदेश से पता चलता है। पहला प्रयास
पहले सूचीबद्ध स्थानीय सेटिंग्स को ठीक करना।
दूसरा, यदि सूचीबद्ध कमांड का उपयोग करते हुए आप कुछ देखते हैं ठीक ठीक (उपसर्ग मेल नहीं खाता
गिनती और केस आमतौर पर मायने रखते हैं) जैसे "En_US" बिना उद्धरण चिह्नों के, तो आपको कोई समस्या नहीं होनी चाहिए
क्योंकि आप एक स्थानीय नाम का उपयोग कर रहे हैं जो आपके सिस्टम में स्थापित और उपलब्ध होना चाहिए।
इस मामले में, "अपने सिस्टम के स्थानीय कॉन्फ़िगरेशन को स्थायी रूप से ठीक करना" देखें।
स्थायी रूप से फिक्सिंग तुंहारे सिस्टम के स्थानीय विन्यास
यह तब होता है जब आप कुछ इस तरह देखते हैं:
पर्ल: चेतावनी: कृपया जांचें कि आपकी स्थानीय सेटिंग:
LC_ALL = "En_US",
लैंग = (असेट)
आपके सिस्टम पर समर्थित और स्थापित हैं।
लेकिन फिर ऊपर बताए गए कमांड द्वारा सूचीबद्ध "En_US" को नहीं देख सकते। आप देख सकते हैं
"en_US.ISO8859-1" जैसी चीज़ें, लेकिन यह समान नहीं है। इस मामले में, किसी के अंतर्गत चलाने का प्रयास करें
वह लोकेल जिसे आप सूचीबद्ध कर सकते हैं और जो किसी तरह आपके द्वारा किए गए प्रयास से मेल खाता है। मिलान के नियम
स्थानीय नाम थोड़े अस्पष्ट हैं क्योंकि इस क्षेत्र में मानकीकरण कमज़ोर है। फिर से देखें
"स्थान ढूँढना" सामान्य नियमों के बारे में।
फिक्सिंग प्रणाली स्थानीय विन्यास
सिस्टम प्रशासक से संपर्क करें (अधिमानतः अपने स्वयं के) और सटीक त्रुटि संदेश की रिपोर्ट करें
आपको जो दस्तावेज़ मिले, उन्हें पढ़ने के लिए कहें, जो आप अभी पढ़ रहे हैं। उन्हें ऐसा करना चाहिए
यह जाँचने में सक्षम कि क्या स्थानीय कॉन्फ़िगरेशन में कुछ गड़बड़ है
सिस्टम। "स्थानीय स्थान ढूँढना" अनुभाग दुर्भाग्य से सटीक जानकारी के बारे में थोड़ा अस्पष्ट है
आदेश और स्थान, क्योंकि ये चीजें इतनी मानकीकृत नहीं हैं।
RSI स्थानीय भाषा समारोह
"POSIX::localeconv()" फ़ंक्शन आपको स्थानीय-निर्भर के विवरण प्राप्त करने की अनुमति देता है
वर्तमान अंतर्निहित "LC_NUMERIC" द्वारा निर्दिष्ट संख्यात्मक स्वरूपण जानकारी और
"LC_MONETARY" लोकल (चाहे "यूज़ लोकेल" के दायरे से बुलाया गया हो या नहीं)
या नहीं)। (यदि आप किसी विशेष श्रेणी के लिए वर्तमान लोकेल का नाम चाहते हैं, तो उपयोग करें
"POSIX::setlocale()" एकल पैरामीटर के साथ - "setlocale फ़ंक्शन" देखें।)
POSIX qw(locale_h) का उपयोग करें;
# स्थानीय-निर्भर जानकारी के हैश का संदर्भ प्राप्त करें
$locale_values = localeconv();
# मानों की क्रमबद्ध सूची आउटपुट करें
(सॉर्ट कुंजियाँ %$locale_values) के लिए {
प्रिंटफ़ "%-20s = %s\n", $_, $locale_values->{$_}
}
"localeconv()" कोई तर्क नहीं लेता है, और लौटाता है a संदर्भ सेवा मेरे एक हैश। इसकी कुंजियाँ
हैश स्वरूपण के लिए चर नाम हैं, जैसे "दशमलव_बिंदु" और "हजारों_सेप"।
मान संगत, एर, मान हैं। लंबे उदाहरण के लिए POSIX में "localeconv" देखें
उन श्रेणियों को सूचीबद्ध करना जो कार्यान्वयन द्वारा प्रदान किए जाने की अपेक्षा की जा सकती है; कुछ अधिक प्रदान करते हैं
और अन्य कम। आपको स्पष्ट "यूज़ लोकेल" की आवश्यकता नहीं है, क्योंकि "localeconv()" हमेशा
वर्तमान स्थान का अवलोकन करता है।
यहाँ एक सरल उदाहरण प्रोग्राम दिया गया है जो अपने कमांड-लाइन पैरामीटर्स को इस प्रकार से पुनः लिखता है
वर्तमान लोकेल में पूर्णांक सही ढंग से स्वरूपित:
POSIX qw(locale_h) का उपयोग करें;
# स्थानीय भाषा के कुछ संख्यात्मक स्वरूपण पैरामीटर प्राप्त करें
मेरा ($thousands_sep, $grouping) =
@{localeconv()}{'thousands_sep', 'समूहीकरण'};
# यदि मान अनुपलब्ध हों तो डिफ़ॉल्ट लागू करें
$thousands_sep = ',' जब तक $thousands_sep;
# ग्रुपिंग और mon_grouping पैक्ड सूचियाँ हैं
छोटे पूर्णांकों (अक्षरों) की संख्या जो बताती है
# समूहीकरण (हजार_सेप्स और मोन_हजार_सेप्स
# संख्याओं के समूह विभाजक होने के नाते) और
# मौद्रिक मात्राएँ। पूर्णांकों के अर्थ:
# 255 का अर्थ है कोई और समूहीकरण नहीं, 0 का अर्थ है दोहराव
# पिछला समूह, 1-254 का अर्थ है कि इसका उपयोग करें
# वर्तमान समूहीकरण के रूप में। समूहीकरण से होता है
# दाएँ से बाएँ (निम्न से उच्च अंक)।
# नीचे हम कभी भी कुछ भी उपयोग नहीं करके थोड़ा धोखा देते हैं
# प्रथम समूह के अलावा अन्य (जो भी हो)।
अगर ($ग्रुपिंग) {
@ग्रुपिंग = अनपैक ("सी*", $ग्रुपिंग);
और} {
@ग्रुपिंग = (३);
}
# वर्तमान लोकेल के लिए कमांड लाइन पैरामीटर्स को प्रारूपित करें
(@ARGV) के लिए {
$_ = int; # गैर-पूर्णांक भाग को काटें
1 जबकि
s/(\d)(\d{$ग्रुपिंग[0]}($|$हजारों_सेप))/$1$हजारों_सेप$2/;
"$_" प्रिंट करें;
}
प्रिंट "\ n";
ध्यान दें कि यदि प्लेटफ़ॉर्म पर "LC_NUMERIC" और/या "LC_MONETARY" उपलब्ध नहीं है या
सक्षम होने पर, हैश के संगत तत्व गायब हो जायेंगे।
I18N :: लैंगइन्फो
स्थानीय-निर्भर जानकारी की क्वेरी के लिए एक और इंटरफ़ेस है
"I18N::Langinfo::langinfo()" फ़ंक्शन, कम से कम यूनिक्स-जैसी प्रणालियों और VMS में उपलब्ध है।
निम्नलिखित उदाहरण "langinfo()" फ़ंक्शन और तीन स्थिरांकों को आयात करेगा
"langinfo()" के लिए तर्क के रूप में उपयोग किया जा सकता है: सप्ताह के संक्षिप्त प्रथम दिन के लिए एक स्थिरांक
(रविवार से अंकन शुरू होता है = 1) और सकारात्मक और सकारात्मक के लिए दो और स्थिरांक
वर्तमान स्थान में हाँ/नहीं प्रश्न के लिए नकारात्मक उत्तर।
I18N::Langinfo qw(langinfo ABDAY_1 YESSTR NOSTR) का उपयोग करें;
मेरा ($abday_1, $yesstr, $nostr)
= मानचित्र { लैंगइन्फो } qw(ABDAY_1 YESSTR NOSTR);
प्रिंट "$abday_1? [$yesstr/$nostr] ";
दूसरे शब्दों में, "सी" (या अंग्रेजी) लोकेल में उपरोक्त संभवतः कुछ प्रिंट करेगा
पसंद:
सूर्य? [हाँ/नहीं]
अधिक जानकारी के लिए I18N::Langinfo देखें.
स्थानीय श्रेणियों
निम्नलिखित उपखंड बुनियादी स्थानीय श्रेणियों का वर्णन करते हैं। इनके अलावा, कुछ और भी हैं
संयोजन श्रेणियाँ एक समय में एक से अधिक मूल श्रेणियों में हेरफेर की अनुमति देती हैं। देखें
इनके बारे में चर्चा के लिए "पर्यावरण" पर जाएँ।
वर्ग "एलसी_कोलेट": मिलान
"यूज़ लोकेल" फॉर्म के दायरे में, जिसमें कोलेशन शामिल है, पर्ल निम्नलिखित को देखता है:
"LC_COLLATE" पर्यावरण चर, अनुप्रयोग के कोलेशन संबंधी विचारों को निर्धारित करने के लिए
वर्णों का (क्रम) उदाहरण के लिए, लैटिन वर्णमाला में "b" "a" के बाद आता है, लेकिन जहाँ
"a" और "aa" कहाँ से आते हैं? और जबकि अंग्रेज़ी में "color" "chocolate" के बाद आता है, तो अंग्रेज़ी में "color" के बारे में क्या कहा जाए?
पारंपरिक स्पेनिश?
निम्नलिखित सभी संकलन अर्थपूर्ण हैं और यदि आप "स्थानीय भाषा का उपयोग" करते हैं तो आप उनमें से किसी से भी मिल सकते हैं।
एबीसीडीई एबीसीडीई
ए ए बी बी सी सी डी डी ई ई
ए ए बी बी सी सी डी डी ई ई
एबीसीडीई एबीसीडीई
यहाँ एक कोड स्निपेट है जो बताता है कि वर्तमान लोकेल में कौन से "शब्द" अक्षर हैं,
स्थानीय आदेश:
स्थानीय भाषा का उपयोग करें;
प्रिंट +(सॉर्ट grep /\w/, मैप { chr } 0..255), "\n";
यदि आप स्पष्ट रूप से कहते हैं कि इसकी तुलना आपके द्वारा देखे गए वर्णों और उनके क्रम से करें
स्थानीय भाषा को नजरअंदाज किया जाना चाहिए:
कोई स्थान नहीं;
प्रिंट +(सॉर्ट grep /\w/, मैप { chr } 0..255), "\n";
यह मशीन-नेटिव कोलेशन (जो आपको तब तक मिलता है जब तक कि "लोकेल का उपयोग करें" प्रकट न हो)
पहले उसी ब्लॉक में) का उपयोग कच्चे बाइनरी डेटा को सॉर्ट करने के लिए किया जाना चाहिए, जबकि लोकेल-
पहले उदाहरण का आश्रित मिलान प्राकृतिक पाठ के लिए उपयोगी है।
जैसा कि "स्थानीयकरण का उपयोग" में उल्लेख किया गया है, "cmp" वर्तमान कोलेशन लोकेल के अनुसार तुलना करता है जब
"लोकेल का उपयोग करें" प्रभावी है, लेकिन स्ट्रिंग्स के लिए अक्षर-दर-अक्षर तुलना पर वापस आ जाता है
लोकेल कहता है कि बराबर हैं। यदि आप नहीं चाहते कि यह गिरे तो आप "POSIX::strcoll()" का उपयोग कर सकते हैं-
वापस:
POSIX qw(strcoll) का उपयोग करें;
$equal_in_locale =
!strcoll("स्पेस और केस अनदेखा", "SpaceAndCaseIgnored");
$equal_in_locale सत्य होगा यदि कोलेशन लोकेल शब्दकोश-जैसी व्यवस्था निर्दिष्ट करता है
जो स्पेस कैरेक्टर को पूरी तरह से नजरअंदाज कर देता है और केस को फोल्ड कर देता है।
पर्ल वर्तमान में केवल "LC_COLLATE" के लिए सिंगल-बाइट लोकल का समर्थन करता है। इसका मतलब है कि
UTF-8 लोकेल संभवतः आपको मशीन-नेटिव ऑर्डरिंग ही देगा। इसके लिए Unicode::Collate का उपयोग करें
यूनिकोड कोलेशन एल्गोरिथ्म का पूर्ण कार्यान्वयन।
यदि आपके पास एक एकल स्ट्रिंग है जिसके विरुद्ध आप "स्थानीय भाषा में समानता" की जांच करना चाहते हैं
कई अन्य, आप सोच सकते हैं कि आप इसका उपयोग करके थोड़ी दक्षता हासिल कर सकते हैं
"POSIX::strxfrm()" को "eq" के साथ संयोजित करके:
POSIX qw(strxfrm) का उपयोग करें;
$xfrm_string = strxfrm("मिश्रित-केस स्ट्रिंग");
प्रिंट "स्थानीय मिलान रिक्त स्थान को अनदेखा करता है\n"
यदि $xfrm_string eq strxfrm("मिश्रित-केसस्ट्रिंग");
प्रिंट "स्थानीय मिलान हाइफ़न को अनदेखा करता है\n"
यदि $xfrm_string eq strxfrm("मिश्रित केस स्ट्रिंग");
प्रिंट "स्थानीय मिलान केस को अनदेखा करता है\n"
यदि $xfrm_string eq strxfrm("मिश्रित-केस स्ट्रिंग");
"strxfrm()" एक स्ट्रिंग लेता है और इसे वर्ण-दर-वर्ण उपयोग के लिए रूपांतरित स्ट्रिंग में मैप करता है
कोलेशन के दौरान अन्य रूपांतरित स्ट्रिंग्स के विरुद्ध तुलना। "अंडर द हुड", लोकेल-
प्रभावित पर्ल तुलना ऑपरेटर दोनों ऑपरेंड के लिए "strxfrm()" को कॉल करते हैं, फिर एक char-by- करते हैं
रूपांतरित स्ट्रिंग्स की चर तुलना। "strxfrm()" को स्पष्ट रूप से कॉल करके और एक का उपयोग करके
स्थानीय भाषा से प्रभावित न होने वाली तुलना में, उदाहरण कुछ परिवर्तनों को बचाने का प्रयास करता है।
लेकिन वास्तव में, यह कुछ भी नहीं बचाता है: पर्ल मैजिक (perlguts में "मैजिक वेरिएबल्स" देखें)
तुलना में पहली बार आवश्यकता पड़ने पर स्ट्रिंग का परिवर्तित संस्करण बनाता है,
फिर इस संस्करण को अपने पास रखता है ताकि अगर इसकी फिर से जरूरत पड़े तो यह काम आ सके। एक उदाहरण जिसे आसानी से फिर से लिखा गया है
"cmp" के साथ यह तरीका लगभग उतनी ही तेजी से चलता है। यह इसमें एम्बेडेड शून्य वर्णों के साथ भी काम करता है
स्ट्रिंग्स; यदि आप सीधे "strxfrm()" को कॉल करते हैं, तो यह पहले मिले नल को स्ट्रिंग्स के रूप में मानता है।
टर्मिनेटर। यह उम्मीद न करें कि इससे उत्पन्न रूपांतरित तार पोर्टेबल होंगे
सिस्टम--या फिर अपने ऑपरेटिंग सिस्टम के एक संशोधन से दूसरे संशोधन तक। संक्षेप में, ऐसा न करें
"strxfrm()" को सीधे कॉल करें: पर्ल को यह काम करने दें।
ध्यान दें: इनमें से कुछ उदाहरणों में "स्थानीय भाषा का उपयोग करें" नहीं दिखाया गया है, क्योंकि इसकी आवश्यकता नहीं है:
"strcoll()" और "strxfrm()" POSIX फ़ंक्शन हैं जो मानक सिस्टम-प्रदत्त का उपयोग करते हैं
"libc" फ़ंक्शन जो सदैव वर्तमान "LC_COLLATE" लोकेल का पालन करते हैं।
वर्ग "LC_CTYPE": चरित्र प्रकार
"यूज़ लोकेल" फॉर्म के दायरे में जिसमें "LC_CTYPE" शामिल है, पर्ल "LC_CTYPE" का पालन करता है
लोकेल सेटिंग। यह एप्लिकेशन की इस धारणा को नियंत्रित करता है कि कौन से अक्षर
वर्णमाला, अंक, विराम चिह्न, आदि. यह पर्ल के "\w" नियमित अभिव्यक्ति को प्रभावित करता है
मेटानोटेशन, जो अल्फ़ान्यूमेरिक वर्णों के लिए है - यानी, वर्णमाला, संख्यात्मक और
प्लेटफ़ॉर्म का मूल अंडरस्कोर। (नियमित के बारे में अधिक जानकारी के लिए perlre से परामर्श करें
अभिव्यक्तियाँ।) "LC_CTYPE" के लिए धन्यवाद, आपकी स्थानीय सेटिंग के आधार पर, जैसे वर्ण
"ae", "`", "ss", और "o" को "\w" वर्णों के रूप में समझा जा सकता है। यह चीज़ों को भी प्रभावित करता है
जैसे "\s", "\D", और POSIX वर्ण वर्ग, जैसे "[[:graph:]]"। (देखें
(इन सभी पर अधिक जानकारी के लिए perlrecharclass देखें।)
"LC_CTYPE" लोकेल, वर्णों के लिप्यंतरण में प्रयुक्त मानचित्र भी प्रदान करता है
लोअर और अपरकेस। यह केस-मैपिंग फ़ंक्शन को प्रभावित करता है--"fc()", "lc()",
"lcfirst()", "uc()", और "ucfirst()"; "\F", "\l", "\L" के साथ केस-मैपिंग इंटरपोलेशन,
"\u", या डबल-कोटेड स्ट्रिंग्स में "\U" और "s///" प्रतिस्थापन; और केस-स्वतंत्र
"i" संशोधक का उपयोग करके नियमित अभिव्यक्ति पैटर्न मिलान।
अंत में, "LC_CTYPE" (बहिष्कृत) POSIX वर्ण-वर्ग परीक्षण को प्रभावित करता है
फ़ंक्शन--"POSIX::isalpha()", "POSIX::islower()", इत्यादि। उदाहरण के लिए, यदि आप
"सी" लोकेल से 7-बिट आईएसओ 646 में परिवर्तित होने पर, आपको यह जानकर आश्चर्य हो सकता है कि
"|" "POSIX::ispunct()" क्लास से "POSIX::isalpha()" में चला जाता है। दुर्भाग्य से, यह
नियमित अभिव्यक्तियों के लिए बड़ी समस्याएँ पैदा करता है। "|" का अर्थ अभी भी प्रत्यावर्तन है, भले ही यह
"\w" से मेल खाता है। v5.22 से शुरू होकर, जब ऐसा लोकेल स्विच किया जाएगा तो एक चेतावनी दी जाएगी
आगे कई पैराग्राफ में अधिक विवरण दिया गया है।
v5.20 से शुरू होकर, Perl "LC_CTYPE" के लिए UTF-8 लोकल का समर्थन करता है, लेकिन अन्यथा केवल Perl
ISO 8859 सीरीज जैसे सिंगल-बाइट लोकल का समर्थन करता है। इसका मतलब है कि वाइड कैरेक्टर
स्थानीय भाषाएँ, उदाहरण के लिए एशियाई भाषाओं के लिए, अच्छी तरह से समर्थित नहीं हैं। (यदि प्लेटफ़ॉर्म है
Perl के लिए ऐसे लोकेल का पता लगाने की क्षमता, Perl v5.22 से शुरू होकर, Perl चेतावनी देगा,
डिफ़ॉल्ट सक्षम, "लोकेल" चेतावनी श्रेणी का उपयोग करते हुए, जब भी ऐसा लोकेल स्विच किया जाता है
UTF-8 लोकेल समर्थन वास्तव में POSIX लोकेल का सुपरसेट है, क्योंकि यह
वास्तव में पूर्ण यूनिकोड व्यवहार जैसे कि कोई "LC_CTYPE" लोकेल प्रभाव में ही न हो (सिवाय इसके कि
दूषित करना; "सुरक्षा" देखें)। POSIX लोकल, यहाँ तक कि UTF-8 वाले भी, कुछ अवधारणाओं की कमी रखते हैं
यूनिकोड में, जैसे कि यह विचार कि किसी अक्षर के केस को बदलने से उसका अर्थ और अधिक विस्तृत हो सकता है
एक से अधिक वर्ण। UTF-8 लोकेल में Perl, आपको वह विस्तार देगा।
v5.20 में, Perl ने कुछ प्लेटफार्मों पर UTF-8 लोकेल का उपयोग किया, जैसे कि ISO 8859-1, कुछ के साथ
प्रतिबंध, और अन्य प्लेटफ़ॉर्म पर "सी" लोकेल की तरह। रिलीज़ v5.16 और
v5.18, "use locale 'not_characters" को इसके लिए वैकल्पिक उपाय के रूप में इस्तेमाल किया जा सकता है (देखें "यूनिकोड
और UTF-8").
ध्यान दें कि ऐसी बहुत सी चीजें हैं जो वर्तमान लोकेल से अप्रभावित हैं।
शाब्दिक वर्ण दिए गए प्लेटफ़ॉर्म के लिए मूल वर्ण है। इसलिए 'A' का अर्थ है
ASCII प्लैटफ़ॉर्म पर कोड पॉइंट 65 पर और EBCDIC पर 193 पर वर्ण। यह हो भी सकता है और नहीं भी
वर्तमान लोकेल में 'A', यदि उस लोकेल में 'A' भी है। इसी तरह, सभी एस्केप
विशेष वर्णों के लिए अनुक्रम, उदाहरण के लिए "\n", हमेशा प्लेटफ़ॉर्म के मूल का मतलब होता है
एक। इसका मतलब है, उदाहरण के लिए, कि नियमित अभिव्यक्तियों में "\N" (प्रत्येक वर्ण को छोड़कर नया-
लाइन) प्लेटफ़ॉर्म कैरेक्टर सेट पर काम करता है.
v5.22 से शुरू होकर, Perl डिफ़ॉल्ट रूप से उस लोकेल में स्विच करते समय चेतावनी देगा जो पुनर्परिभाषित करता है
किसी भी ASCII मुद्रण योग्य वर्ण (प्लस "\t" और "\n") को अपेक्षा से भिन्न वर्ग में परिवर्तित करना।
ऐसा केवल ईबीसीडीआईसी प्लेटफॉर्म पर आधुनिक स्थानों पर ही होने की संभावना है, जहां, उदाहरण के लिए,
CCSID 0037 मशीन पर CCSID 1047 लोकेल "[" को स्थानांतरित करता है, लेकिन यह ASCII प्लेटफ़ॉर्म पर हो सकता है
ISO 646 और अन्य 7-बिट लोकल के साथ जो अनिवार्य रूप से अप्रचलित हैं। चीजें अभी भी हो सकती हैं
काम इस बात पर निर्भर करता है कि प्रोग्राम द्वारा पर्ल की कौन सी विशेषताएँ उपयोग की जाती हैं। उदाहरण के लिए,
ऊपर से उदाहरण जहाँ "|" एक "\w" बन जाता है, और वहाँ कोई नियमित अभिव्यक्ति नहीं है जहाँ
यह मायने रखता है, प्रोग्राम अभी भी ठीक से काम कर सकता है। चेतावनी में सभी वर्णों की सूची दी गई है
यह निर्धारित किया जा सकता है कि इससे प्रतिकूल प्रभाव पड़ सकता है।
नोट: एक टूटी हुई या दुर्भावनापूर्ण "LC_CTYPE" लोकेल परिभाषा के परिणामस्वरूप स्पष्ट रूप से अयोग्य परिणाम हो सकते हैं
आपके एप्लिकेशन द्वारा वर्णों को अल्फ़ान्यूमेरिक माना जा रहा है। सख्त मिलान के लिए
(साधारण) ASCII अक्षरों और अंकों का - उदाहरण के लिए, कमांड स्ट्रिंग्स में - स्थानीय-जागरूक
अनुप्रयोगों को "\w" का उपयोग "/a" नियमित अभिव्यक्ति संशोधक के साथ करना चाहिए। "सुरक्षा" देखें।
वर्ग "एलसी_न्यूमेरिक": सांख्यिक फॉर्मेटिंग
उचित "POSIX::setlocale()" कॉल के बाद, और "use locale" फॉर्म के दायरे में
जिसमें अंक शामिल हैं, पर्ल "LC_NUMERIC" स्थानीय जानकारी का पालन करता है, जो एक विशिष्ट स्थानीयकरण फ़ंक्शन को नियंत्रित करता है।
एप्लिकेशन का विचार है कि मानवीय पठनीयता के लिए संख्याओं को किस तरह से प्रारूपित किया जाना चाहिए। अधिकांशतः
कार्यान्वयन का एकमात्र प्रभाव दशमलव के लिए उपयोग किए जाने वाले वर्ण को बदलना है
बिंदु--शायद "." से "," तक। फ़ंक्शन हज़ारों जैसी बारीकियों से अवगत नहीं हैं
पृथक्करण और इसी तरह की अन्य बातें। (यदि आप इन चीजों के बारे में चिंतित हैं तो "loceconv फ़ंक्शन" देखें।)
POSIX qw(strtod setlocale LC_NUMERIC) का उपयोग करें;
स्थानीय भाषा का उपयोग करें;
सेटलोकेल LC_NUMERIC, "";
$n = 5/2; # $n को संख्यात्मक 2.5 निर्दिष्ट करें
$a = " $n"; # स्थानीय-निर्भर स्ट्रिंग में रूपांतरण
प्रिंट "आधा पांच $n\n है"; # लोकेल-निर्भर आउटपुट
प्रिंटफ "आधा पांच %g\n है", $n; # लोकेल-निर्भर आउटपुट
प्रिंट करें "दशमलव बिंदु अल्पविराम है\n"
if $n == (strtod("2,5"))[0]; # स्थानीय-निर्भर रूपांतरण
I18N::Langinfo और "RADIXCHAR" भी देखें.
वर्ग "एलसी_मौद्रिक": फॉर्मेटिंग of मौद्रिक राशियाँ
सी मानक "LC_MONETARY" श्रेणी को परिभाषित करता है, लेकिन इससे प्रभावित होने वाले फ़ंक्शन को नहीं
इसकी विषय-वस्तु। (मानक समितियों के अनुभव वाले लोग यह पहचानेंगे कि
कार्य समूह ने इस मुद्दे पर विचार न करने का निर्णय लिया।) परिणामस्वरूप, पर्ल मूलतः इस मुद्दे पर कोई विचार नहीं करता।
इसकी सूचना दें। यदि आप वास्तव में "LC_MONETARY" का उपयोग करना चाहते हैं, तो आप इसकी सामग्री की जांच कर सकते हैं - देखें
"localeconv फ़ंक्शन"--और आपके एप्लिकेशन में इसके द्वारा लौटाई गई जानकारी का उपयोग करें
मुद्रा राशियों का अपना स्वरूपण। हालाँकि, आपको यह जानकारी मिल सकती है कि,
यद्यपि यह बहुत बड़ा और जटिल है, फिर भी यह आपकी आवश्यकताओं को पूरा नहीं करता है:
मुद्रा स्वरूपण एक कठिन काम है।
I18N::Langinfo और "CRNCYSTR" भी देखें.
"एलसी_टाइम"
"POSIX::strftime()" द्वारा उत्पादित आउटपुट, जो एक स्वरूपित मानव-पठनीय दिनांक/समय बनाता है
स्ट्रिंग, वर्तमान "LC_TIME" लोकेल से प्रभावित होती है। इस प्रकार, एक फ्रेंच लोकेल में, आउटपुट
वर्ष के पहले महीने के लिए %B प्रारूप तत्व (पूर्ण माह का नाम) द्वारा उत्पादित
"janvier" हो। वर्तमान लोकेल में लंबे महीनों के नामों की सूची प्राप्त करने का तरीका यहां दिया गया है:
POSIX qw(strftime) का उपयोग करें;
(0..11) के लिए {
$long_month_name[$_] =
strftime("%B", 0, 0, 0, 1, $_, 96);
}
नोट: इस उदाहरण में "use locale" की आवश्यकता नहीं है: "strftime()" एक POSIX फ़ंक्शन है जो
मानक सिस्टम-प्रदत्त "libc" फ़ंक्शन का उपयोग करता है जो हमेशा वर्तमान "LC_TIME" का पालन करता है
स्थानीय.
I18N::Langinfo और "ABDAY_1".."ABDAY_7", "DAY_1".."DAY_7", "ABMON_1".."ABMON_12" भी देखें
और "ABMON_1".."ABMON_12".
अन्य श्रेणियाँ
शेष स्थानीय श्रेणियाँ वर्तमान में पर्ल द्वारा स्वयं उपयोग नहीं की जाती हैं। लेकिन फिर से ध्यान दें
पर्ल जिन चीज़ों के साथ इंटरैक्ट करता है, वे इनका उपयोग कर सकते हैं, जिनमें मानक के बाहर के एक्सटेंशन भी शामिल हैं
पर्ल वितरण, तथा ऑपरेटिंग सिस्टम और इसकी उपयोगिताओं द्वारा। विशेष रूप से ध्यान दें कि
$! का स्ट्रिंग मान और बाहरी उपयोगिताओं द्वारा दिए गए त्रुटि संदेश बदले जा सकते हैं
"LC_MESSAGES" द्वारा। यदि आप पोर्टेबल त्रुटि कोड चाहते हैं, तो "%!" का उपयोग करें। Errno देखें।
सुरक्षा
हालाँकि पर्ल सुरक्षा मुद्दों की मुख्य चर्चा perlsec में पाई जा सकती है, एक चर्चा
पर्ल की लोकेल हैंडलिंग का अध्ययन अधूरा रहेगा यदि यह आपका ध्यान लोकेल की ओर आकर्षित नहीं करता है-
आश्रित सुरक्षा मुद्दे। स्थानीयकरण - विशेष रूप से उन प्रणालियों पर जो अनधिकृत उपयोगकर्ताओं को अनुमति देते हैं
अपने खुद के लोकल बनाने के लिए--अविश्वसनीय हैं। दुर्भावनापूर्ण (या सिर्फ़ सादा टूटा हुआ) लोकल
स्थानीय-जागरूक एप्लिकेशन को अप्रत्याशित परिणाम दे सकता है। यहाँ कुछ हैं
संभावनाओं:
· "\w" का उपयोग करके सुरक्षित फ़ाइल नामों या मेल पतों के लिए नियमित अभिव्यक्ति जाँच की जा सकती है
एक "LC_CTYPE" लोकेल द्वारा धोखा दिया गया जो दावा करता है कि ">" और "|" जैसे वर्ण हैं
अक्षरांकीय.
· केस-मैपिंग के साथ स्ट्रिंग इंटरपोलेशन, जैसे कि, मान लीजिए, "$dest = "C:\U$name.$ext"", हो सकता है
यदि फर्जी "LC_CTYPE" केस-मैपिंग तालिका प्रभावी है तो खतरनाक परिणाम उत्पन्न हो सकते हैं।
· एक गुप्त "LC_COLLATE" लोकेल के परिणामस्वरूप "D" ग्रेड वाले छात्रों के नाम सामने आ सकते हैं
"A" वाले लोगों से आगे दिखाई देना।
· एक एप्लिकेशन जो "LC_MONETARY" में जानकारी का उपयोग करने का कष्ट उठाता है, वह प्रारूपित कर सकता है
डेबिट को ऐसे मानो वे क्रेडिट हों और इसके विपरीत, यदि उस स्थान को बदल दिया गया हो। या
वह हांगकांग डॉलर के बजाय अमेरिकी डॉलर में भुगतान कर सकता है।
· "strftime()" द्वारा स्वरूपित तिथियों में दिनांक और दिन के नामों में हेरफेर किया जा सकता है
दुर्भावनापूर्ण उपयोगकर्ता द्वारा "LC_DATE" लोकेल को नष्ट करने में सक्षम होने का लाभ। ("देखो - यह कहता है मैं
रविवार को वह इमारत में नहीं था।")
ऐसे खतरे स्थानीय सिस्टम तक ही सीमित नहीं हैं: किसी एप्लिकेशन के किसी भी पहलू में
दुर्भावनापूर्ण तरीके से संशोधित किया जा सकने वाला वातावरण भी इसी तरह की चुनौतियाँ प्रस्तुत करता है।
वे पर्ल तक सीमित नहीं हैं: कोई भी प्रोग्रामिंग भाषा जो आपको प्रोग्राम लिखने की अनुमति देती है
जो लोग अपने पर्यावरण को ध्यान में रखते हैं, वे आपको इन मुद्दों से अवगत कराते हैं।
पर्ल आपको उदाहरणों में दिखाए गए सभी संभावनाओं से नहीं बचा सकता - कोई भी नहीं है
अपनी स्वयं की सतर्कता के लिए स्थानापन्न - लेकिन, जब "स्थानीय भाषा का उपयोग करें" प्रभावी होता है, तो पर्ल इसका उपयोग करता है
स्थानीय-निर्भर बनने वाले स्ट्रिंग परिणामों को चिह्नित करने के लिए दाग़ने की प्रणाली (perlsec देखें), और
जो परिणामस्वरूप अविश्वसनीय हो सकता है। यहाँ कलंकित करने वाले व्यवहार का सारांश दिया गया है
ऑपरेटर और फ़ंक्शन जो लोकेल से प्रभावित हो सकते हैं:
· तुलना ऑपरेटरों ("lt", "le", "ge", "gt" और "cmp"):
स्केलर सत्य/असत्य (या कम/बराबर/अधिक) परिणाम कभी भी दूषित नहीं होता।
· केस-मैपिंग प्रक्षेप ("\l", "\L", "\u", "\U", या "\F" के साथ)
यदि "स्थानीय भाषा का उपयोग करें" फ़ॉर्म है, तो इंटरपोलेशन सामग्री युक्त परिणाम स्ट्रिंग दूषित हो जाती है
जिसमें "LC_CTYPE" शामिल है, प्रभावी है।
· मिलान ऑपरेटर ("एम//"):
स्केलर सत्य/असत्य परिणाम कभी दूषित नहीं होता।
सभी उप-पैटर्न, या तो सूची-संदर्भ परिणाम के रूप में या $1 के रूप में वितरित किए जाते हैं आदि., दूषित हैं
यदि "LC_CTYPE" को शामिल करने वाला "स्थानीय भाषा का उपयोग करें" फ़ॉर्म प्रभावी है, और उपपैटर्न
नियमित अभिव्यक्ति में स्थानीय-निर्भर निर्माण शामिल है। इन निर्माणों में शामिल हैं
"\w" (अल्फ़ान्यूमेरिक वर्ण से मिलान करने के लिए), "\W" (गैर-अल्फ़ान्यूमेरिक वर्ण), "\b" और
"\B" (शब्द-सीमा और गैर-सीमा, जो इस बात पर निर्भर करता है कि "\w" और "\W" क्या मेल खाते हैं), "\s"
(रिक्त स्थान वर्ण), "\S" (गैर रिक्त स्थान वर्ण), "\d" और "\D" (अंक और
गैर-अंक), और POSIX वर्ण वर्ग, जैसे कि "[:alpha:]" (देखें "POSIX वर्ण वर्ग", जैसे कि "[:alpha:]"
कैरेक्टर क्लासेस" perlrecharclass में).
यदि पैटर्न को केस-असंवेदनशील रूप से (/i के माध्यम से) मिलान किया जाए तो भी दाग लगने की संभावना है।
अपवाद तब है जब इस तरह से मिलान किए जाने वाले सभी कोड बिंदु 255 से ऊपर हों और
यूनिकोड नियमों के तहत 256 से नीचे फोल्ड नहीं होना चाहिए। इनके लिए दाग़ना नहीं किया जाता है
क्योंकि पर्ल ऐसे कोड बिंदुओं के लिए केवल यूनिकोड नियमों का उपयोग करता है, और वे नियम ही हैं
वर्तमान स्थान चाहे जो भी हो, वही रहेगा।
मिलान पैटर्न चर, $&, "$`" (मिलान से पहले), "$'" (मिलान के बाद), और $+ (अंतिम)
मैच) भी दूषित हैं।
· प्रतिस्थापन ऑपरेटर ("एस///"):
मैच ऑपरेटर के समान ही व्यवहार होता है। साथ ही, "=~" का बायां ऑपरेंड बन जाता है
दूषित तब होता है जब "उपयोग लोकेल" फ़ॉर्म जिसमें "LC_CTYPE" शामिल है, प्रभावी होता है, यदि इसे संशोधित किया जाता है
किसी भी नियमित अभिव्यक्ति मिलान के आधार पर प्रतिस्थापन का परिणाम
पिछले आइटम में बताई गई चीज़ें, या केस-मैपिंग, जैसे "\l", "\L","\u",
"\U", या "\F".
· उत्पादन स्वरूपण कार्यों ("प्रिंटफ़()" और "राइट()"):
परिणाम कभी भी दूषित नहीं होते क्योंकि अन्यथा प्रिंट से प्राप्त आउटपुट भी, उदाहरण के लिए
यदि "use locale" प्रभावी है तो "print(1/7)", को दूषित किया जाना चाहिए।
· केस-मैपिंग कार्यों ("एलसी()", "एलसीफर्स्ट()", "यूसी()", "यूसीफर्स्ट()"):
यदि "LC_CTYPE" को शामिल करने वाला "स्थानीय भाषा का उपयोग करें" प्रपत्र प्रभावी है, तो परिणाम दूषित हो जाते हैं।
· POSIX स्थान पर निर्भर कार्यों ("लोकेलकॉनव()", "स्ट्रकॉल()", "स्ट्रफ़टाइम()",
"स्ट्रक्सफर्म()"):
परिणाम कभी भी खराब नहीं होते।
· POSIX चरित्र कक्षा परीक्षण ("POSIX::isalnum()", "POSIX::isalpha()",
"POSIX::isdigit()", "POSIX::isgraph()", "POSIX::islower()", "POSIX::isprint()",
"POSIX::ispunct()", "POSIX::isspace()", "POSIX::isupper()", "POSIX::isxdigit()"):
सत्य/असत्य परिणाम कभी भी दूषित नहीं होते।
तीन उदाहरण स्थानीय-निर्भर व्यतिकरण को दर्शाते हैं। पहला प्रोग्राम, जो अपने को अनदेखा करता है
locale, नहीं चलेगा: कमांड लाइन से सीधे लिया गया मान किसी नाम के लिए इस्तेमाल नहीं किया जा सकता है
आउटपुट फ़ाइल जब दाग़ जाँच सक्षम हैं।
#/usr/स्थानीय/bin/perl -T
# दाग जाँच के साथ चलाएँ
# कमांड लाइन सेनिटी जांच छोड़ी गई...
$tainted_output_file = शिफ्ट;
open(F, ">$tainted_output_file")
या चेतावनी दें "$tainted_output_file का खुलना विफल: $!\n";
प्रोग्राम को नियमित रूप से दूषित मूल्य को "धोने" के द्वारा चलाया जा सकता है
अभिव्यक्ति: दूसरा उदाहरण - जो अभी भी स्थानीय जानकारी को अनदेखा करता है - चलता है, बनाता है
यदि संभव हो तो, अपनी कमांड लाइन पर फ़ाइल का नाम बदलें।
#/usr/स्थानीय/bin/perl -T
$tainted_output_file = शिफ्ट;
$tainted_output_file =~ m%[\w/]+%;
$untainted_output_file = $&;
open(F, ">$untainted_output_file")
या चेतावनी दें "$untainted_output_file का खुलना विफल: $!\n";
इसकी तुलना एक समान लेकिन स्थानीय-जागरूक प्रोग्राम से करें:
#/usr/स्थानीय/bin/perl -T
$tainted_output_file = शिफ्ट;
स्थानीय भाषा का उपयोग करें;
$tainted_output_file =~ m%[\w/]+%;
$स्थानीयकृत_आउटपुट_फ़ाइल = $&;
open(F, ">$localized_output_file")
या चेतावनी दें "$localized_output_file का खुलना विफल: $!\n";
यह तीसरा प्रोग्राम चलने में विफल हो जाता है क्योंकि $& दूषित है: यह एक मिलान का परिणाम है
"\w" को शामिल करते हुए जब "स्थानीय उपयोग करें" प्रभावी हो।
वातावरण
PERL_SKIP_LOCALE_INIT
यह पर्यावरण चर, Perl v5.20 से उपलब्ध है, यदि सेट किया गया है (किसी भी
value), पर्ल को शेष पर्यावरण चरों का उपयोग न करने के लिए कहता है
इसके बजाय, पर्ल जो भी मौजूदा स्थानीय सेटिंग है उसका उपयोग करता है।
यह विशेष रूप से एम्बेडेड वातावरण में उपयोगी है, देखें "एम्बेडेड पर्ल का उपयोग करना"
POSIX लोकेल के साथ" perlembed में.
PERL_बैडलांग
एक स्ट्रिंग जो विफल लोकेल सेटिंग्स के बारे में पर्ल की चेतावनी को दबा सकती है
स्टार्टअप। ऑपरेटिंग सिस्टम में स्थानीय समर्थन होने पर विफलता हो सकती है
किसी तरह से कमी (टूटा हुआ) - या यदि आपने किसी स्थान का नाम गलत टाइप किया हो
अपना वातावरण सेट करें। यदि यह वातावरण चर अनुपस्थित है, या इसमें कोई
"0" या "" के अलावा अन्य मान, पर्ल स्थानीय सेटिंग विफलताओं के बारे में शिकायत करेगा।
ध्यान दें: "PERL_BADLANG" आपको केवल चेतावनी संदेश छिपाने का एक तरीका देता है।
संदेश आपके सिस्टम के स्थानीय समर्थन में कुछ समस्या के बारे में बताता है, और आप
समस्या क्या है इसकी जांच होनी चाहिए।
DPKG_RUNNING_VERSION
डेबियन सिस्टम पर, यदि DPKG_RUNNING_VERSION पर्यावरण चर सेट किया गया है (
कोई भी मान), स्थानीय विफलता चेतावनियाँ दबा दी जाएँगी जैसे कि
PERL_BADLANG सेटिंग को शून्य करें। यह झूठी चेतावनियों की बाढ़ से बचने के लिए किया जाता है
सिस्टम अपग्रेड के दौरान। देखेंhttp://bugs.debian.org/508764>.
निम्नलिखित पर्यावरण चर Perl के लिए विशिष्ट नहीं हैं: वे इसका हिस्सा हैं
मानकीकृत (ISO C, XPG4, POSIX 1.c) "setlocale()" विधि को नियंत्रित करने के लिए
डेटा पर एप्लिकेशन की राय। विंडोज गैर-POSIX है, लेकिन पर्ल निम्नलिखित के लिए व्यवस्था करता है
वैसे भी वर्णित तरीके से काम करने के लिए। यदि किसी पर्यावरण चर द्वारा दिया गया लोकेल मान्य नहीं है,
पर्ल प्राथमिकता में अगले निचले वाले को आज़माता है। यदि कोई भी मान्य नहीं है, तो विंडोज़ पर, सिस्टम
फिर डिफ़ॉल्ट लोकेल आज़माया जाता है। अगर सब कुछ विफल हो जाता है, तो "C" लोकेल का उपयोग किया जाता है। अगर वह भी
काम नहीं करता है, कुछ बुरी तरह से टूट गया है, लेकिन पर्ल जो कुछ भी है उसके साथ आगे बढ़ने की कोशिश करता है
स्थानीय सेटिंग्स हो सकता है.
"LC_ALL" "LC_ALL" "ओवरराइड-ऑल" लोकेल एनवायरनमेंट वैरिएबल है। अगर सेट किया गया है, तो यह
शेष सभी स्थानीय पर्यावरण चरों को ओवरराइड करता है।
"भाषा" ध्यान दें: "LANGUAGE" एक GNU एक्सटेंशन है, यह आपको तभी प्रभावित करता है जब आप इसका उपयोग कर रहे हों
GNU libc. यह मामला तब है जब आप उदाहरण के लिए Linux का उपयोग कर रहे हैं। यदि आप उपयोग कर रहे हैं
"वाणिज्यिक" यूनिक्स आप सबसे अधिक संभावना है नहीं GNU libc का उपयोग करके आप कर सकते हैं
"भाषा" को अनदेखा करें.
हालाँकि, यदि आप "भाषा" का उपयोग कर रहे हैं: तो यह भाषा को प्रभावित करता है
कमांड द्वारा आउटपुट की गई सूचनात्मक, चेतावनी और त्रुटि संदेश (दूसरे शब्दों में,
यह "LC_MESSAGES" जैसा है) लेकिन इसकी प्राथमिकता "LC_ALL" से अधिक है। इसके अलावा,
यह एक एकल मान नहीं है, बल्कि एक "पथ" (":" से अलग की गई सूची) है भाषाओं
(स्थानीय नहीं)। अधिक जानकारी के लिए GNU "gettext" लाइब्रेरी दस्तावेज़ देखें
जानकारी.
"LC_CTYPE" "LC_ALL" की अनुपस्थिति में, "LC_CTYPE" वर्ण प्रकार लोकेल चुनता है।
"LC_ALL" और "LC_CTYPE" दोनों की अनुपस्थिति में, "LANG" वर्ण प्रकार चुनता है
स्थानीय.
"एलसी_कोलेट"
"LC_ALL" की अनुपस्थिति में, "LC_COLLATE" कोलेशन (सॉर्टिंग) का चयन करता है
लोकेल। "LC_ALL" और "LC_COLLATE" दोनों की अनुपस्थिति में, "LANG" चुनता है
मिलान स्थान.
"एलसी_मौद्रिक"
"LC_ALL" की अनुपस्थिति में, "LC_MONETARY" मौद्रिक स्वरूपण चुनता है
लोकेल। "LC_ALL" और "LC_MONETARY" दोनों की अनुपस्थिति में, "LANG" चुनता है
मौद्रिक स्वरूपण स्थान.
"एलसी_न्यूमेरिक"
"LC_ALL" की अनुपस्थिति में, "LC_NUMERIC" संख्यात्मक प्रारूप लोकेल चुनता है।
"LC_ALL" और "LC_NUMERIC" दोनों की अनुपस्थिति में, "LANG" संख्यात्मक मान चुनता है
प्रारूप.
"LC_TIME" "LC_ALL" की अनुपस्थिति में, "LC_TIME" दिनांक और समय स्वरूपण चुनता है
लोकेल। "LC_ALL" और "LC_TIME" दोनों की अनुपस्थिति में, "LANG" चुनता है
दिनांक और समय स्वरूपण स्थान.
"LANG" "LANG" "catch-all" लोकेल वातावरण चर है। यदि यह सेट है, तो यह
समग्र "LC_ALL" और श्रेणी-विशिष्ट के बाद अंतिम उपाय के रूप में उपयोग किया जाता है
"एलसी_फू".
उदाहरण
"LC_NUMERIC" संख्यात्मक आउटपुट को नियंत्रित करता है:
स्थानीय भाषा का उपयोग करें;
POSIX qw(locale_h) का उपयोग करें; # setlocale() और LC_ स्थिरांक को आयात करता है।
setlocale(LC_NUMERIC, "fr_FR") या मरो "क्षमा करें";
printf "%g\n", 1.23; # यदि "fr_FR" सफल हुआ, तो संभवतः 1,23 दिखाएगा।
और यह भी कि "POSIX::strtod()" द्वारा स्ट्रिंग्स को संख्याओं के रूप में कैसे पार्स किया जाता है:
स्थानीय भाषा का उपयोग करें;
POSIX qw(locale_h strtod) का उपयोग करें;
सेटलोकेल(LC_NUMERIC, "de_DE") या डाई "एंट्सचुल्डीगंग";
मेरा $x = strtod("2,34") + 5;
print $x, "\n"; # संभवतः 7,34 दर्शाता है.
टिप्पणियाँ
तार "eval" और "एलसी_न्यूमेरिक"
एक स्ट्रिंग eval अपने एक्सप्रेशन को मानक Perl के रूप में पार्स करता है। इसलिए यह अपेक्षा कर रहा है
दशमलव बिंदु को बिंदु के रूप में सेट करें। यदि "LC_NUMERIC" को इसके बजाय अल्पविराम के रूप में सेट किया जाता है, तो
पार्सिंग भ्रमित हो जाएगी, शायद चुपचाप।
स्थानीय भाषा का उपयोग करें;
POSIX qw(locale_h) का उपयोग करें;
setlocale(LC_NUMERIC, "fr_FR") या मरो "क्षमा करें";
मेरा $a = 1.2;
प्रिंट eval "$a + 1.5";
प्रिंट "\ n";
"13,5" प्रिंट करता है। ऐसा इसलिए है क्योंकि उस लोकेल में, अल्पविराम दशमलव बिंदु वर्ण है।
इस प्रकार "eval" का विस्तार इस प्रकार होगा:
मूल्यांकन "1,2 + 1.5"
और परिणाम वह नहीं है जिसकी आपने उम्मीद की थी। कोई चेतावनी नहीं दी जाती। यदि आप ऐसा करते हैं
स्ट्रिंग "eval" "use locale" के दायरे में है, तो आपको इसके बजाय "eval" को बदलना चाहिए
लाइन में कुछ इस तरह से करें:
प्रिंट eval "कोई लोकेल नहीं; $a + 1.5";
यह 2.7 प्रिंट करता है.
यदि आपको इसकी आवश्यकता न हो तो आप "LC_NUMERIC" को भी हटा सकते हैं,
लोकेल ':!numeric' का उपयोग करें;
पिछड़ा अनुकूलता
पर्ल के 5.004 से पहले के संस्करण अधिकतर स्थानीय जानकारी को नजरअंदाज कर दिया, आम तौर पर इस तरह व्यवहार करना
यदि "सी" लोकेल के समान कुछ हमेशा लागू होता था, भले ही प्रोग्राम
पर्यावरण अन्यथा सुझाव देता है (देखें "सेटलोकेल फ़ंक्शन")। डिफ़ॉल्ट रूप से, पर्ल अभी भी
पश्चगामी संगतता के लिए इस तरह से व्यवहार करता है। यदि आप चाहते हैं कि पर्ल एप्लीकेशन भुगतान करे
स्थानीय जानकारी पर ध्यान दें, आप चाहिए "use locale" प्रैग्मा का उपयोग करें (देखें "use locale" प्रैग्मा)
लोकेल" प्राग्मा") या, असंभावित घटना में आप ऐसा सिर्फ पैटर्न के लिए करना चाहते हैं
मिलान, "/l" नियमित अभिव्यक्ति संशोधक (perlre में "वर्ण सेट संशोधक" देखें)
उसे ऐसा करने का निर्देश देना।
पर्ल के 5.002 से 5.003 संस्करणों में "LC_CTYPE" जानकारी का उपयोग किया गया, यदि उपलब्ध हो;
है, "\w" समझ गया कि स्थानीय वातावरण के अनुसार अक्षर क्या थे
समस्या यह थी कि उपयोगकर्ता के पास सुविधा पर कोई नियंत्रण नहीं था: यदि सी
लाइब्रेरी समर्थित लोकेल्स, पर्ल ने उनका उपयोग किया।
I18N:संकलन अप्रचलित
पर्ल के 5.004 से पहले के संस्करणों में, प्रति-स्थानीय मिलान संभव था
"I18N::Collate" लाइब्रेरी मॉड्यूल। यह मॉड्यूल अब थोड़ा अप्रचलित हो चुका है और इससे बचना चाहिए
नए अनुप्रयोगों में। "LC_COLLATE" कार्यक्षमता अब Perl कोर में एकीकृत है
भाषा: "यूज़ लोकेल" के साथ लोकेल-विशिष्ट स्केलर डेटा का पूरी तरह से सामान्य रूप से उपयोग किया जा सकता है,
इसलिए अब "I18N::Collate" के स्केलर संदर्भों के साथ छेड़छाड़ करने की कोई आवश्यकता नहीं है।
तरह गति और स्मृति उपयोग प्रभावों
स्थानीय भाषा के आधार पर तुलना और छँटाई आमतौर पर डिफ़ॉल्ट छँटाई की तुलना में धीमी होती है;
दो से चार बार देखा गया है। यह अधिक मेमोरी भी खपत करेगा: एक बार पर्ल
स्केलर चर ने किसी भी स्ट्रिंग तुलना या सॉर्टिंग ऑपरेशन में भाग लिया है
स्थानीय कोलेशन नियमों के अनुसार, इसमें पहले की तुलना में 3-15 गुना अधिक मेमोरी लगेगी। (सटीक
गुणक स्ट्रिंग की सामग्री, ऑपरेटिंग सिस्टम और लोकेल पर निर्भर करता है।) ये
ऑपरेटिंग सिस्टम के स्थानीय सिस्टम के कार्यान्वयन से नकारात्मक पक्ष अधिक प्रभावित होते हैं
पर्ल की तुलना में.
आज़ादी से उपलब्ध स्थानीय परिभाषाएँ
यूनिकोड सीएलडीआर परियोजना अपने कई लोकल्स के POSIX भाग को निकालती है, जो यहां उपलब्ध है
http://unicode.org/Public/cldr/latest/
यहाँ स्थानीय परिभाषाओं का एक बड़ा संग्रह है:
http://std.dkuug.dk/i18n/WG15-collection/locales/
आपको ज्ञात होना चाहिए कि यह असमर्थित है, तथा किसी भी उद्देश्य के लिए उपयुक्त होने का दावा नहीं किया गया है।
यदि आपका सिस्टम मनमाने लोकल की स्थापना की अनुमति देता है, तो आपको परिभाषाएं मिल सकती हैं
वे जितने उपयोगी हों, या आपके अपने स्थानों के विकास के लिए आधार के रूप में उपयोगी हों।
I18n और l10n
"अंतर्राष्ट्रीयकरण" को अक्सर संक्षिप्त रूप में लिखा जाता है i18n क्योंकि इसके पहले और अंतिम अक्षर हैं
अठारह अन्य लोगों द्वारा अलग किया गया। (आप अनुमान लगा सकते हैं कि आंतरिक ... आंतरिकता ... i18n क्यों
संक्षिप्त हो जाता है।) उसी तरह, "स्थानीयकरण" को अक्सर संक्षिप्त किया जाता है l10n.
An अपूर्ण मानक
C और POSIX मानकों में परिभाषित अंतर्राष्ट्रीयकरण की आलोचना इस प्रकार की जा सकती है
अधूरा, भद्दा, और बहुत अधिक विस्तृत विवरण वाला। (स्थानीय शब्द पूरे पर लागू होते हैं
प्रक्रिया, जबकि यकीनन उन्हें एकल थ्रेड पर लागू करना अधिक उपयोगी होगा,
विंडो समूह, या जो भी हो।) उनमें भी मानक समूहों की तरह विभाजन की प्रवृत्ति होती है
दुनिया को राष्ट्रों में विभाजित करना, जबकि हम सभी जानते हैं कि दुनिया को समान रूप से कई राष्ट्रों में विभाजित किया जा सकता है।
बैंकर्स, बाइकर्स, गेमर्स, इत्यादि।
यूनिकोड और UTF-8
यूनिकोड का समर्थन पर्ल संस्करण v5.6 से शुरू होकर और अधिक पूर्ण रूप से क्रियान्वित किया गया है
v5.8 और बाद के संस्करणों में। perluniintro देखें।
Perl v5.20 से शुरू होकर, "LC_COLLATE" (उपयोग) को छोड़कर, UTF-8 लोकल Perl में समर्थित हैं
Unicode::Collate का उपयोग करें)। यदि आपके पास Perl v5.16 या v5.18 है और आप अपग्रेड नहीं कर सकते, तो आप इसका उपयोग कर सकते हैं
लोकेल का उपयोग करें ':not_characters';
जब प्रैग्मा के इस रूप का उपयोग किया जाता है, तो केवल स्थानीयकरण के गैर-वर्ण भागों का उपयोग किया जाता है
Perl द्वारा, उदाहरण के लिए "LC_NUMERIC"। Perl मानता है कि आपने सभी का अनुवाद कर दिया है
यूनिकोड (वास्तव में प्लेटफ़ॉर्म का मूल वर्ण सेट) में कार्य करने के लिए आवश्यक वर्ण
(ASCII या EBCDIC) प्लस यूनिकोड)। फ़ाइलों में डेटा के लिए, यह आसानी से भी किया जा सकता है
निर्दिष्ट करना
खुले ':locale' का उपयोग करें;
यह प्रैग्मा फाइलों से सभी इनपुट को यूनिकोड में अनुवादित करने की व्यवस्था करता है।
पर्यावरण में निर्दिष्ट वर्तमान लोकेल (देखें "पर्यावरण"), और सभी आउटपुट
फ़ाइलों को वापस लोकेल में अनुवादित किया जाना है। (ओपन देखें)। प्रति-फ़ाइलहैंडल के आधार पर, आप
इसके बजाय PerlIO::locale मॉड्यूल, या Encode::Locale मॉड्यूल का उपयोग कर सकते हैं, दोनों उपलब्ध हैं
CPAN से। बाद वाले मॉड्यूल में "ARGV" और "ARGV" को हैंडल करना आसान बनाने के तरीके भी हैं
पर्यावरण चर, और व्यक्तिगत स्ट्रिंग पर इस्तेमाल किया जा सकता है। यदि आप जानते हैं कि आपके सभी
स्थानीयकरण UTF-8 होगा, क्योंकि इन दिनों कई हैं, आप इसका उपयोग कर सकते हैं -C कमांड लाइन स्विच।
प्रैग्मा का यह रूप यूनिकोड के साथ स्थानीयकरण को अनिवार्यतः निर्बाध रूप से संचालित करने की अनुमति देता है।
कोलेशन ऑर्डर यूनिकोड कोड पॉइंट ऑर्डर के अनुसार होगा। यह दृढ़ता से अनुशंसित है कि जब
आपको स्ट्रिंग्स को क्रमबद्ध करने और छांटने की आवश्यकता है जिसके लिए आप मानक मॉड्यूल Unicode::Collate का उपयोग करते हैं
कई मामलों में पुराने स्टाइल के लोकेल से बेहतर परिणाम मिलते हैं
हैंडलिंग।
अभी वर्णित सभी मॉड्यूल और स्विच को केवल सादे "उपयोग" के साथ v5.20 में उपयोग किया जा सकता है
locale" और, यदि इनपुट locales UTF-8 नहीं है, तो आपको आदर्श से कम परिणाम मिलेगा
व्यवहार, जिसका वर्णन नीचे किया गया है, जो आपको प्री-v5.16 पर्ल्स के साथ मिलता है, या जब आप लोकेल का उपयोग करते हैं
pragma v5.16 और v5.18 में ":not_characters" पैरामीटर के बिना। यदि आप उपयोग कर रहे हैं
v8 और उच्चतर में विशेष रूप से UTF-5.20 लोकल, इस खंड का शेष भाग इस पर लागू नहीं होता है
आप
इसके दो मामले हैं, मल्टी-बाइट और सिंगल-बाइट लोकल। पहला मल्टी-बाइट:
एकमात्र मल्टी-बाइट (या वाइड कैरेक्टर) लोकेल जिसे पर्ल कभी भी समर्थन दे सकता है, वह है
UTF-8. यह कार्यान्वयन की कठिनाई के कारण है, तथ्य यह है कि उच्च गुणवत्ता वाले UTF-8
अब दुनिया के हर क्षेत्र के लिए स्थानीय समाचार प्रकाशित किए जाते हैं
(<http://unicode.org/Public/cldr/latest/>), और यह कि असफल होने पर आप इसका उपयोग कर सकते हैं
अपने लोकेल से/में अनुवाद करने के लिए एनकोड मॉड्यूल। तो, आपको इनमें से एक काम करना होगा
यदि आप इनमें से किसी एक लोकल का उपयोग कर रहे हैं, जैसे कि Big5 या Shift JIS। UTF-8 लोकल के लिए,
पर्ल्स (पूर्व संस्करण 5.20) जिनमें पूर्ण UTF-8 लोकेल समर्थन नहीं है, वे यथोचित रूप से अच्छी तरह से काम कर सकते हैं
(आपके सी लाइब्रेरी कार्यान्वयन पर निर्भर करता है) केवल इसलिए क्योंकि वे और पर्ल दोनों स्टोर करते हैं
ऐसे अक्षर जो एक ही तरह से कई बाइट्स लेते हैं। हालाँकि, कुछ, यदि अधिकांश नहीं, सी
लाइब्रेरी कार्यान्वयन लैटिन-1 के ऊपरी आधे भाग में वर्णों को संसाधित नहीं कर सकता है
श्रेणी (128 - 255) को "LC_CTYPE" के अंतर्गत ठीक से टाइप करें। यह देखने के लिए कि कोई वर्ण किसी विशेष प्रकार का है या नहीं
किसी लोकेल के अंतर्गत, Perl "isalnum()" जैसे फ़ंक्शन का उपयोग करता है। हो सकता है कि आपकी C लाइब्रेरी इसके लिए काम न करे
उन फ़ंक्शनों के साथ UTF-8 लोकल, केवल नई वाइड लाइब्रेरी के अंतर्गत काम करते हैं
"iswalnum()" जैसे फ़ंक्शन, जिसका उपयोग Perl नहीं करता है। ये मल्टी-बाइट लोकल हैं
इन्हें एकल-बाइट लोकल की तरह माना जाएगा, तथा इनमें नीचे वर्णित प्रतिबंध होंगे।
Perl v5.22 से शुरू होकर, जब Perl मल्टी-बाइट लोकेल का पता लगाता है, तो एक चेतावनी संदेश प्रदर्शित होता है
जिसका यह पूर्ण समर्थन नहीं करता है।
एकल-बाइट लोकेल के लिए, पर्ल आम तौर पर कोड बिंदुओं पर लोकेल नियमों का उपयोग करने का तरीका अपनाता है
जो एक बाइट में समा सकते हैं, और जो नहीं समा सकते उनके लिए यूनिकोड नियम (हालाँकि यह नहीं है)
समान रूप से लागू किया जाता है, इस अनुभाग के अंत में नोट देखें)। इससे कई समस्याओं से बचा जा सकता है
ऐसे स्थानों में जो UTF-8 नहीं हैं। मान लीजिए कि स्थान ISO8859-7, ग्रीक है।
0xD7 में कैपिटल चि है। लेकिन ISO8859-1 लोकेल, लैटिन1 में, यह एक गुणन है
संकेत। POSIX नियमित अभिव्यक्ति वर्ण वर्ग "[[:alpha:]]" जादुई रूप से मेल खाएगा
0xD7 ग्रीक लोकेल में है लेकिन लैटिन में नहीं।
हालाँकि, कुछ जगहें ऐसी हैं जहाँ यह टूट जाती है। कुछ पर्ल निर्माण यूनिकोड के लिए हैं
केवल, जैसे कि "\p{Alpha}"। वे मानते हैं कि 0xD7 का हमेशा यूनिकोड अर्थ होता है (या
ईबीसीडीआईसी प्लेटफॉर्म पर समतुल्य) चूंकि लैटिन1 यूनिकोड का उपसमुच्चय है और 0xD7 यूनिकोड का उपसमुच्चय है
लैटिन1 और यूनिकोड दोनों में गुणन चिह्न, "\p{Alpha}" कभी भी इससे मेल नहीं खाएगा,
लोकेल की परवाह किए बिना। "\N{...}" के साथ भी ऐसी ही समस्या होती है। v5.20 से पहले, यह
इसलिए सादे "यूज़ लोकेल" के अंतर्गत "\p{}" या "\N{}" का प्रयोग करना बुरा विचार है--जब तक आप कर सकते हैं
गारंटी है कि लोकेल ISO8859-1 होगा। इसके बजाय POSIX वर्ण वर्गों का उपयोग करें।
इस दृष्टिकोण के साथ एक और समस्या यह है कि जो ऑपरेशन एकल बाइट/एकाधिक को पार करते हैं
बाइट सीमा अच्छी तरह से परिभाषित नहीं है, और इसलिए इसकी अनुमति नहीं है। (यह सीमा के बीच है
255/256 पर कोडपॉइंट।) उदाहरण के लिए, लोअर केसिंग लैटिन कैपिटल लेटर Y विद डायरेसिस
(U+0178) को लैटिन छोटा अक्षर Y विद डायरेसिस (U+00FF) वापस करना चाहिए। लेकिन ग्रीक में
उदाहरण के लिए, 0xFF पर कोई वर्ण नहीं है, और पर्ल के पास यह जानने का कोई तरीका नहीं है कि XNUMXxFF पर कौन सा वर्ण है।
0xFF पर मौजूद अक्षर वास्तव में क्या दर्शाता है। इस प्रकार यह ऑपरेशन को अस्वीकार कर देता है।
इस मोड में, U+0178 का लोअरकेस अक्षर स्वयं है।
यदि आप अपनी मानक फ़ाइल का स्वचालित UTF-8-ification सक्षम करते हैं तो भी यही समस्याएँ उत्पन्न होती हैं
हैंडल, डिफ़ॉल्ट "open()" लेयर, और गैर-ISO8859-1, गैर-UTF-8 लोकेल पर @ARGV (उपयोग करके)
या तो -C कमांड लाइन स्विच या "PERL_UNICODE" पर्यावरण चर; देखें
perlrun) चीज़ें UTF-8 के रूप में पढ़ी जाती हैं, जो सामान्यतः यूनिकोड का संकेत देती हैं
व्याख्या, लेकिन किसी स्थान की उपस्थिति के कारण उन्हें उसी स्थान में व्याख्यायित किया जाता है
इसके बजाय। उदाहरण के लिए, यूनिकोड इनपुट में 0xD7 कोड बिंदु, जिसका अर्थ होना चाहिए
गुणन चिह्न, ग्रीक लोकेल के अंतर्गत पर्ल द्वारा उस तरह से व्याख्या नहीं किया जाएगा। यह
एक समस्या नहीं है बशर्ते आप यह सुनिश्चित करते हैं कि सभी स्थान हमेशा और केवल या तो होंगे
एक ISO8859-1, या, यदि आपके पास एक अपूर्ण C लाइब्रेरी नहीं है, तो एक UTF-8 लोकेल।
एक और समस्या यह है कि इस दृष्टिकोण से दो कोड बिंदु उत्पन्न हो सकते हैं जिनका अर्थ एक ही होता है
इस प्रकार एक ग्रीक लोकेल में, U+03A7 और U+00D7 दोनों ग्रीक कैपिटल लेटर CHI हैं।
इन सभी समस्याओं के कारण, v5.22 से शुरू होकर, Perl एक चेतावनी देगा यदि कोई मल्टी-
बाइट (इसलिए यूनिकोड) कोड बिंदु का उपयोग तब किया जाता है जब एकल-बाइट लोकेल प्रभावी होता है। (हालांकि
यदि ऐसा करने से निष्पादन अनुचित रूप से धीमा हो जाएगा तो यह इसकी जांच नहीं करता है।)
विक्रेता के स्थानीयकरण में बहुत अधिक त्रुटियाँ होती हैं, और पर्ल के लिए अपने स्थानीयकरण का परीक्षण करना कठिन होता है।
कोड को संभालना क्योंकि यह उस कोड के साथ इंटरैक्ट करता है जिस पर पर्ल का कोई नियंत्रण नहीं है; इसलिए
पर्ल में लोकेल-हैंडलिंग कोड भी बगयुक्त हो सकता है। (हालाँकि, यूनिकोड द्वारा प्रदत्त
स्थानीयकरण बेहतर होना चाहिए, और किसी भी समस्या को ठीक करने के लिए एक फीडबैक तंत्र होना चाहिए। देखें
"स्वतंत्र रूप से उपलब्ध स्थानीय परिभाषाएँ".)
यदि आपके पास Perl v5.16 है, तो ऊपर बताई गई समस्याएं दूर हो जाएंगी यदि आप इसका उपयोग करते हैं
": not_characters" पैरामीटर को लोकेल प्रैग्मा में जोड़ें (गैर-लोकेल प्रैग्मा में विक्रेता बग को छोड़कर)
चरित्र भाग)। यदि आपके पास v5.16 नहीं है, और आप do ऐसे स्थान हैं जो काम करते हैं, उनका उपयोग करते हुए
वे कुछ विशिष्ट उद्देश्यों के लिए उपयोगी हो सकते हैं, बशर्ते आप इन बातों को ध्यान में रखें
गॉटचास पहले ही उल्लेख किया जा चुका है। उदाहरण के लिए, यदि आपके लोकल के लिए कोलेशन काम करता है, तो यह चलता है
यूनिकोड::कोलेट की तुलना में लोकल के अंतर्गत अधिक तेजी से; और आपको निम्नलिखित चीजों तक पहुंच प्राप्त होती है:
स्थानीय मुद्रा का प्रतीक और सप्ताह के महीनों और दिनों के नाम। (लेकिन
इस बात पर जोर देते हुए कि, v5.16 में, आपको स्थानीयकरण की कमियों के बिना यह पहुँच प्राप्त होती है
(प्रैग्मा के ":not_characters" रूप का उपयोग करके)
नोट: एक बाइट में फिट हो सकने वाले कोड बिंदुओं के लिए स्थानीय नियमों का उपयोग करने की नीति, और यूनिकोड
जो लोग ऐसा नहीं कर सकते उनके लिए नियम समान रूप से लागू नहीं होते हैं। प्री-v5.12, यह कुछ हद तक था
बेतरतीब; v5.12 में इसे नियमित अभिव्यक्ति मिलान के लिए काफी सुसंगत रूप से लागू किया गया था
ब्रैकेटेड वर्ण वर्गों को छोड़कर; v5.14 में इसे सभी रेगेक्स मिलानों तक विस्तारित किया गया था; तथा
v5.16 में केसिंग ऑपरेशन जैसे "\L" और "uc()" को शामिल किया गया है। सभी रिलीज़ में कोलेशन के लिए
अब तक, सिस्टम का "strxfrm()" फ़ंक्शन कॉल किया जाता है, और जो कुछ भी यह करता है वही आपको मिलता है।
onworks.net सेवाओं का उपयोग करके ऑनलाइन perllocale का उपयोग करें