2011-07-05 15 views
9

मैं यूनिकोड कोड पॉइंट्स की एक सरणी बनाना चाहता हूं जो जावास्क्रिप्ट में श्वेत स्थान का गठन करे (यूनिकोड-व्हाइट-स्पेस कोड पॉइंट्स को घटाएं, जिसे मैं अलग से संबोधित करता हूं)। ये वर्ण क्षैतिज टैब, लंबवत टैब, फॉर्म फ़ीड, स्थान, गैर-ब्रेकिंग स्पेस और बीओएम हैं। मैं जादू संख्याओं के साथ ऐसा कर सकता था:मैं पाइथन में अपने नाम से यूनिकोड चरित्र कैसे निर्धारित कर सकता हूं, भले ही वह चरित्र एक नियंत्रण चरित्र है?

whitespace = [0x9, 0xb, 0xc, 0x20, 0xa0, 0xfeff] 

यह थोड़ा अस्पष्ट है; नाम बेहतर होंगे। unicodedata.lookup विधि ord के माध्यम से पारित कुछ मदद करता है:

>>> ord(unicodedata.lookup("NO-BREAK SPACE")) 
160 

लेकिन इस 0x9, 0xb, या 0xc के लिए काम नहीं करता है - मुझे लगता है कि क्योंकि वे नियंत्रण वर्ण हैं, और "नाम" फार्म फ़ीड और इस तरह कर रहे हैं बस उपनाम नाम। क्या मानक पायथन में इन "नामों" को वर्णों, या उनके कोड बिंदुओं को मैप करने का कोई तरीका है? या मैं भाग्य से बाहर हूँ?

+3

कितना अस्पष्ट - यदि यह एक-एक, वैश्विक स्तर पर निरंतर सूची है, तो क्या आप केवल संख्या अक्षर लिख नहीं सकते हैं और यूनिकोड नाम को टिप्पणी में डाल सकते हैं? –

+1

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

+1

यह एक समस्या क्यों होगी? संख्या * सभी के बाद मानकीकृत हैं। क्या आपके ग्राहकों को डर है कि आप उन्हें किसी तरह से धोखा देंगे? –

उत्तर

13

केरेक एसबी की टिप्पणी एक अच्छी है: बस नामों को एक टिप्पणी में रखें।

Btw, अजगर भी एक नामित यूनिकोड शाब्दिक समर्थन करता है:

>>> u"\N{NO-BREAK SPACE}" 
u'\xa0' 

लेकिन यह एक ही यूनिकोड नाम डेटाबेस का उपयोग करता है, और नियंत्रण वर्ण यह में नहीं हैं।

2

यूनिकोड public directory में यूसीडी फ़ाइलों की कुछ पंक्तियों को पार्स करके आप नियंत्रण वर्णों के लिए अपना "डेटाबेस" रोल कर सकते हैं। विशेष रूप से, UnicodeData-6.1.0d3 फ़ाइल देखें (या पिछले संस्करणों के लिए मूल निर्देशिका देखें)।

+0

यह शानदार है: '000 9; ; सीसी; 0; एस ;;;;; एन; वर्णक सारणी ;;; –

2

मुझे नहीं लगता कि यह मानक पायथन में किया जा सकता है। unicodedata मॉड्यूल UnicodeData.txt v5.2.0 यूनिकोड डेटाबेस का उपयोग करता है। ध्यान दें कि नियंत्रण वर्णों को सभी नाम <control> (दूसरा फ़ील्ड, अर्धविराम-सीमांकित) असाइन किया गया है।

पायथन स्रोत वितरण में स्क्रिप्ट Tools/unicode/makeunicodedata.py का उपयोग पायथन रनटाइम द्वारा उपयोग की जाने वाली तालिका उत्पन्न करने के लिए किया जाता है। makeunicodename समारोह इस तरह दिखता है:

def makeunicodename(unicode, trace): 

    FILE = "Modules/unicodename_db.h" 

    print "--- Preparing", FILE, "..." 

    # collect names 
    names = [None] * len(unicode.chars) 

    for char in unicode.chars: 
     record = unicode.table[char] 
     if record: 
      name = record[1].strip() 
      if name and name[0] != "<": 
       names[char] = name + chr(0) 
    ... 

सूचना है कि यह प्रविष्टियों जिसका नाम "<" साथ शुरू होता है से अधिक छोड़ देता है। इसलिए, ऐसा कोई नाम नहीं है जिसे unicodedata.lookup पर पारित किया जा सके जो आपको उन नियंत्रण वर्णों में से एक वापस दे देगा।

क्षैतिज टैब, लाइन फ़ीड और कैरिज रिटर्न के लिए कोड बिंदुओं को बस हार्डकोड करें, और एक वर्णनात्मक टिप्पणी छोड़ दें। Zen of Python चला जाता है, "व्यावहारिकता शुद्धता धड़कता है"।

0

मान लें कि आप यूनिकोड तारों के साथ काम कर रहे हैं, आपकी सूची में पहले पांच आइटम, साथ ही अन्य सभी यूनिकोड स्पेस वर्ण, नियमित अभिव्यक्ति का उपयोग करते समय \s विकल्प से मेल खाते हैं। अजगर 3.1.2 का उपयोग करना:

>>> import re 
>>> s = '\u0009,\u000b,\u000c,\u0020,\u00a0,\ufeff' 
>>> s 
'\t,\x0b,\x0c, ,\xa0,\ufeff' 
>>> re.findall(r'\s', s) 
['\t', '\x0b', '\x0c', ' ', '\xa0'] 

और बाइट-आदेश निशान के लिए के रूप में, यह देखते हुए एक codecs.BOM_BE या codecs.BOM_UTF16_BE के रूप में भेजा जा सकता है (हालांकि अजगर 3+ में, यह नहीं बल्कि str की तुलना में एक bytes वस्तु के रूप में वापस आ रहा है) ।

0

official Unicode recommendation न्यूलाइन के लिए पाइथन codecs मॉड्यूल न्यूलाइन संभालता है जिस तरह से बाधाओं में हो सकता है या नहीं हो सकता है।चूंकि u'\n' अक्सर मतलब "नई लाइन" कहा जाता है, एक चरित्र U+2028 LINE SEPARATOR प्रतिनिधित्व करने के लिए और नहीं बल्कि अर्थ-कम नियंत्रण चरित्र U+000A के रूप में की तुलना में, इस तरह के रूप एन्कोड करने की पायथन स्ट्रिंग u'\n' के लिए इस सिफारिश के आधार पर उम्मीद कर सकते हैं। लेकिन मैं केवल भ्रम की कल्पना कर सकता हूं जिसके परिणामस्वरूप codecs मॉड्यूल वास्तव में उस नीति को लागू करता है, और इसके अलावा वैध काउंटर-तर्क भी हैं। क्षैतिज/लंबवत टैब और फॉर्म फ़ीड के लिए डिट्टो, जो शायद वास्तव में वर्ण नहीं हैं लेकिन वैसे भी नियंत्रण करते हैं। (मैं निश्चित रूप से बैकस्पेस को नियंत्रण के रूप में मानता हूं, एक चरित्र नहीं।)

आपका प्रश्न यह मानता है कि U+000A को एक नियंत्रण चरित्र (लाइन विभाजक के बजाय) के रूप में व्यवहार करना गलत है; लेकिन यह बिल्कुल निश्चित नहीं है। शायद टेक्स्ट प्रसंस्करण अनुप्रयोगों के लिए हर जगह यह मानना ​​गलत है कि एक विरासत प्रिंटर-प्लेटिन-स्क्रॉलिंग नियंत्रण संकेत वास्तव में एक वास्तविक "लाइन विभाजक" है।

1

कुछ अंक:

(1) "BOM" नहीं एक पात्र है। बीओएम एक बाइट अनुक्रम है जो यूटीएफ-एनएन में एन्कोड किए गए फ़ाइल के बाइट ऑर्डर को इंगित करने के लिए फ़ाइल की शुरुआत में दिखाई देता है। बीओएम आप 'यूएफएफएफ' एनकोड ('यूटीएफ-एनएन') है। उपयुक्त कोडेक के साथ एक फाइल पढ़ना बीओएम slurp जाएगा; आप इसे यूनिकोड चरित्र के रूप में नहीं देखते हैं। एक बीओएम डेटा नहीं है। यदि आप अपने डेटा में '\ uFEFF' देखते हैं, तो इसे एक (बहिष्कृत) शून्य-दृष्टि NO-BREAK स्थान के रूप में देखें।

(2) "यूनिकोड-व्हाइट-स्पेस कोड पॉइंट्स को घटाएं, जिसे मैं अलग से संबोधित करता हूं" ?? नहीं है- BREAK एक "यूनिकोड-व्हाइट-स्पेस" कोड बिंदु स्पेस करें?

(3) आपका पायथन टूटा हुआ प्रतीत होता है; मेरा यह करता है:

>>> ord(unicodedata.lookup("NO-BREAK SPACE")) 
160 

(4) आप पहले तीन के लिए बचने के दृश्यों का उपयोग कर सकते हैं।

>>> map(hex, map(ord, "\t\v\f")) 
['0x9', '0xb', '0xc'] 

(5) आप चौथे स्थान के लिए " " का उपयोग कर सकते हैं।

(6) भले ही आप नामों का उपयोग कर सकें, फिर भी आपके कोड के पाठक अंधे विश्वास को लागू करेंगे जो उदा। "फॉर्म फीड" एक व्हाइटस्पेस चरित्र है।

(7) \r और \n पर क्या हुआ?

+0

जावास्क्रिप्ट में कुछ विचित्र विरासत-संगतता विशिष्टताएं हैं, इनमें से कुछ यूसीएस -2 पर आधारित होने के बजाय अधिक समझदार यूटीएफ- 16, उनमें से कुछ लोग कोड लिख रहे हैं कि पुराने इंजन स्वीकार करने के लिए (गलत तरीके से या नहीं) और कौन से नए इंजनों को बाजार हिस्सेदारी प्राप्त करने का मौका मिला है।तो हम वास्तव में एक स्क्रिप्ट के पाठ में यादृच्छिक बीओएम का इलाज व्हाइटस्पेस के रूप में करना चाहिए। –

+0

"माइनस द ..." के लिए, जेएस स्पेक इस तरह से अनावश्यक है, इसलिए इसे करने योग्यता के लिए उचित है। "टूटा हुआ" के लिए, मुझे लगता है कि मैंने किसी भी तरह से अपने कंसोल से गलत प्रतिलिपि बनाई है (इसके बारे में खेद है), क्योंकि मुझे वही 160 मिल गया है जो आप करते हैं। एफएफ के लिए व्हाइटस्पेस होने के लिए, मुझे उम्मीद है कि पाठक जेएस स्पेक की तुलना करने के लिए इसकी तुलना करेगा। '\ R \ n' के लिए, कोड 'व्हाइटस्पेस या कोड लिनटेरम्स में कोड' के बाद कोड करता है, प्रक्रिया में उनको पकड़ लेता है। –

+0

@ जेफ वाल्डन: जैसा कि मैंने कहा, "पाठ में बीओएम" नहीं होता है। आपके पाठ में 'u' \ uFEFF' कोई बोम नहीं है। इसे शून्य-दृष्टि नो-BREAK स्पेस के रूप में माना जाना चाहिए, जो सफेद जगह है। जैसा चाहें उतना ही परिणाम, बस इसे एक बोम मत कहो। –

-1

आप शामिल वर्णों को संभालने के लिए लुकअप फ़ंक्शन का विस्तार कर सकते हैं।

def unicode_lookup(x): 
    try: 
     ch = unicodedata.lookup(x) 
    except KeyError: 
     control_chars = {'LINE FEED':unichr(0x0a),'CARRIAGE RETURN':unichr(0x0d)} 
     if x in control_chars: 
      ch = control_chars[x] 
     else: 
      raise 
    return ch 

>>> unicode_lookup('SPACE') 
u' ' 
>>> unicode_lookup('LINE FEED') 
u'\n' 
>>> unicode_lookup('FORM FEED') 

Traceback (most recent call last): 
    File "<pyshell#17>", line 1, in <module> 
    unicode_lookup('FORM FEED') 
    File "<pyshell#13>", line 3, in unicode_lookup 
    ch = unicodedata.lookup(x) 
KeyError: "undefined character name 'FORM FEED'" 
+0

-1 इस तथ्य से काफी अलग है कि यह कुछ ऐसा लिखने का एक लंबा तरीका है जो "पाठक के साथ विश्वसनीयता" समस्या को दूर नहीं करता है, आपकी अपनी विश्वसनीयता समस्या है: 'लेन (u' \ x000a ')' उत्पादन 3 –

+0

@ जॉन, इसे पकड़ने के लिए धन्यवाद - मैंने कभी अनुमान लगाया होगा कि यूनिकोड हेक्स स्थिरांक दो अंकों तक सीमित होगा। मैंने उन्हें पूरी तरह से 'unichr' कॉल के साथ बदल दिया है। विश्वसनीयता की समस्या के लिए, इसके आसपास वास्तव में कोई रास्ता नहीं है। यदि मानक लाइब्रेरी इसे प्रदान नहीं करती है, तो सबसे अच्छा विकल्प एक ऐसा फ़ंक्शन प्रदान करना है जिसे केवल एक बार पेश किया जाना चाहिए। –

+0

फिर भी, पहले कारण के लिए, प्लस 'unichr (0x0a)' preosterous obfuscation cpmpared है 'u' \ n'' –

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