2010-04-30 9 views
16

का उपयोग कर स्ट्रिंग से गैर-ASCII वर्णों को हटाएं मेरे पास डेटाबेस में संग्रहीत HTML की एक स्ट्रिंग है। दुर्भाग्यवश इसमें ® जैसे वर्ण शामिल हैं, मैं इन वर्णों को उनके HTML समकक्ष द्वारा प्रतिस्थापित करना चाहता हूं, या तो डीबी में या अपने पायथन/Django कोड में एक ढूँढें स्थान का उपयोग करना चाहता हूं।पायथन/django

कोई सुझाव यह है कि मैं यह कैसे कर सकता हूं?

+3

का उपयोग करके आप उन्हें क्यों बदलना चाहते हैं? यदि आपके पास यूनिकोड सही है तो उन्हें केवल पृष्ठ में ठीक दिखाना चाहिए। आप जो कुछ भी करते हैं, ** ** ** अपने डेटाबेस में एचटीएमएल-एन्कोडेड डेटा डालें। बॉबेंस के लिए – bobince

+0

+1: क्या आप वाकई उन्हें बदलना चाहते हैं? आपको केवल उस ब्राउज़र को बताना होगा जिसे आप मेटा टैग जोड़कर '<मेटा http-equiv = "सामग्री-प्रकार" सामग्री = "टेक्स्ट/html; charset = utf-8" /> ' –

उत्तर

19

आप उपयोग कर सकते हैं कि ASCII वर्ण पहले 128 लोगों को है, इसलिए ord साथ हर किरदार की संख्या हो और पट्टी यह अगर यह सीमा से बाहर

# -*- coding: utf-8 -*- 

def strip_non_ascii(string): 
    ''' Returns the string without non ASCII characters''' 
    stripped = (c for c in string if 0 < ord(c) < 127) 
    return ''.join(stripped) 


test = u'éáé123456tgreáé@€' 
print test 
print strip_non_ascii(test) 

परिणाम

éáé123456tgreáé@€ 
[email protected] 

है कृपया ध्यान दें कि @ शामिल है क्योंकि, ठीक है, इसके बाद यह एक ASCII चरित्र है। यदि आप एक विशेष सबसेट (जैसे संख्याओं और अपरकेस और लोअरकेस अक्षरों) को पट्टी करना चाहते हैं, तो आप ASCII table

संपादित करने वाली श्रेणी को सीमित कर सकते हैं संपादित करें: फिर से अपना प्रश्न पढ़ने के बाद, शायद आपको अपने HTML कोड से बचने की आवश्यकता है, इसलिए एक बार प्रस्तुत किए जाने वाले सभी वर्ण सही ढंग से दिखाई देते हैं। आप अपने टेम्पलेट्स पर escape फ़िल्टर का उपयोग कर सकते हैं।

+1

AFAIK Django के मेटा टैग जोड़कर यूनिकोड का उपयोग कर रहे हैं। एस्केप फ़िल्टर यूनिकोड वर्णों से नहीं बचता है, यह केवल इनसे बचता है: '< > "' और' – Zack

3

मुझे यह कुछ समय पहले मिला, इसलिए यह मेरे काम में किसी भी तरह से नहीं है। मुझे स्रोत नहीं मिल रहा है, लेकिन यहां मेरे कोड से स्निपेट है।

def unicode_escape(unistr): 
    """ 
    Tidys up unicode entities into HTML friendly entities 

    Takes a unicode string as an argument 

    Returns a unicode string 
    """ 
    import htmlentitydefs 
    escaped = "" 

    for char in unistr: 
     if ord(char) in htmlentitydefs.codepoint2name: 
      name = htmlentitydefs.codepoint2name.get(ord(char)) 
      entity = htmlentitydefs.name2codepoint.get(name) 
      escaped +="&#" + str(entity) 

     else: 
      escaped += char 

    return escaped 

इस

>>> from zack.utilities import unicode_escape 
>>> unicode_escape(u'such as ® I want') 
u'such as &#174 I want' 
0

आप कोई लेना देना नहीं होना चाहिए जैसे कि यह प्रयोग करें, के रूप में Django स्वचालित रूप से वर्ण से बचें देगा:

देखें: http://docs.djangoproject.com/en/dev/topics/templates/#id2

+2

Django स्वचालित रूप से यूनिकोड वर्णों से नहीं बचता है, यह केवल इनसे बचता है: '< >" 'और ' – Zack

+0

यह सही है, लेकिन केवल वही है जो उसे चाहिए पलायन करना ! – sebpiq

1

से छुटकारा पाने के विशेष एक्सएमएल, एचटीएमएल वर्ण '<', '>', '&' आप cgi.escape का उपयोग कर सकते हैं:

import cgi 
test = "1 < 4 & 4 > 1" 
cgi.escape(test) 

वापसी करेंगे:

'1 &lt; 4 &amp; 4 &gt; 1' 

यह शायद न्यूनतम आप इस समस्या से बचने की जरूरत है। अधिक के लिए आपको अपनी स्ट्रिंग के एन्कोडिंग को जानना होगा। यदि यह आपके एचटीएमएल दस्तावेज़ के एन्कोडिंग में फिट है तो आपको कुछ और करने की ज़रूरत नहीं है। यदि आपको सही एन्कोडिंग में कनवर्ट नहीं करना है।

test = test.decode("cp1252").encode("utf8") 

जाना चाहिए कि अपने स्ट्रिंग cp1252 था और कहा कि अपने HTML दस्तावेज़ UTF8

2

है यह कोड स्निपेट आपकी मदद कर सकता है।

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 

def removeNonAscii(string): 
    nonascii = bytearray(range(0x80, 0x100)) 
    return string.translate(None, nonascii) 

nonascii_removed_string = removeNonAscii(string_to_remove_nonascii) 

एन्कोडिंग परिभाषा यहाँ बहुत महत्वपूर्ण है जो दूसरी पंक्ति में किया जाता है।

0

वहाँ https://stackoverflow.com/a/18430817/5100481

, s, उपयोग एक स्ट्रिंग से गैर- ASCII वर्ण को निकालने के लिए इस के लिए एक बहुत सरल जवाब है:

s = s.encode('ascii',errors='ignore')

तो यह बाइट्स से वापस एक स्ट्रिंग का उपयोग कर परिवर्तित :

s = s.decode()

यह सब पायथन 3.6