2012-07-01 49 views
88

Có trong ngắn hạn tôi muốn biết tại sao tôi nhìn thấy một u ở phía trước của các phím và giá trị của tôi.Biểu tượng 'u' có nghĩa là gì trước các giá trị chuỗi?

Tôi đang hiển thị biểu mẫu. Biểu mẫu có hộp kiểm cho nhãn cụ thể và một trường văn bản cho địa chỉ IP. Tôi đang tạo một từ điển với các phím là nhãn được mã hóa cứng trong list_key và các giá trị cho từ điển được lấy từ đầu vào biểu mẫu (list_value). Từ điển được tạo nhưng nó được bắt đầu bằng u cho một số giá trị. đây là đầu ra mẫu cho từ điển:

{u'1': {'broadcast': u'on', 'arp': '', 'webserver': '', 'ipaddr': u'', 'dns': ''}} 

ai đó có thể giải thích những gì tôi đang làm sai. Tôi không nhận được lỗi khi tôi mô phỏng phương pháp tương tự trong pyscripter. Bất kỳ đề xuất nào để cải thiện mã đều được chào đón. Cảm ơn bạn

#!/usr/bin/env python 

import webapp2 
import itertools 
import cgi 

form =""" 
    <form method="post"> 
    FIREWALL 
    <br><br> 
    <select name="profiles"> 
     <option value="1">profile 1</option> 
     <option value="2">profile 2</option> 
     <option value="3">profile 3</option> 
    </select> 
    <br><br> 
    Check the box to implement the particular policy 
    <br><br> 

    <label> Allow Broadcast 
     <input type="checkbox" name="broadcast"> 
    </label> 
    <br><br> 

    <label> Allow ARP 
     <input type="checkbox" name="arp"> 
    </label><br><br> 

    <label> Allow Web traffic from external address to internal webserver 
     <input type="checkbox" name="webserver"> 
    </label><br><br> 

    <label> Allow DNS 
     <input type="checkbox" name="dns"> 
    </label><br><br> 

    <label> Block particular Internet Protocol address 
     <input type="text" name="ipaddr"> 
    </label><br><br> 

    <input type="submit"> 
    </form> 
""" 
dictionarymain={} 

class MainHandler(webapp2.RequestHandler): 
    def get(self): 
     self.response.out.write(form) 

    def post(self): 
     # get the parameters from the form 
     profile = self.request.get('profiles') 

     broadcast = self.request.get('broadcast') 
     arp = self.request.get('arp') 
     webserver = self.request.get('webserver') 
     dns =self.request.get('dns') 
     ipaddr = self.request.get('ipaddr') 


     # Create a dictionary for the above parameters 
     list_value =[ broadcast , arp , webserver , dns, ipaddr ] 
     list_key =['broadcast' , 'arp' , 'webserver' , 'dns' , 'ipaddr' ] 

     #self.response.headers['Content-Type'] ='text/plain' 
     #self.response.out.write(profile) 

     # map two list to a dictionary using itertools 
     adict = dict(zip(list_key,list_value)) 
     self.response.headers['Content-Type'] ='text/plain' 
     self.response.out.write(adict) 

     if profile not in dictionarymain: 
      dictionarymain[profile]= {} 
     dictionarymain[profile]= adict 

     #self.response.headers['Content-Type'] ='text/plain' 
     #self.response.out.write(dictionarymain) 

     def escape_html(s): 
      return cgi.escape(s, quote =True) 



app = webapp2.WSGIApplication([('/', MainHandler)], 
           debug=True) 
+1

Là câu hỏi thực tế của bạn "Tại sao tôi lại thấy một 'u' trước khóa và giá trị của tôi"? – jdi

+0

Và bạn không hiển thị bất cứ nơi nào mà bạn đang nhận được một lỗi ở nơi đầu tiên. – jdi

+3

Đó là bởi vì chúng là các chuỗi unicode: http://stackoverflow.com/questions/599625/python-string-prints-as-ustring – user

Trả lời

121

'u' ở phía trước giá trị chuỗi có nghĩa là chuỗi đã được biểu diễn dưới dạng unicode. Các chữ cái trước các chuỗi ở đây được gọi là "Khai báo mã hóa chuỗi". Unicode là một cách để đại diện cho nhiều ký tự hơn so với ascii bình thường có thể quản lý.

Bạn có thể chuyển đổi một chuỗi Unicode nhiều cách:

>>> u'foo' 
u'foo' 
>>> unicode('foo') 
u'foo' 

Nhưng lý do thực sự là đại diện cho một cái gì đó như thế này (translation here):

>>> val = u'Ознакомьтесь с документацией' 
>>> val 
u'\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439' 
>>> print val 
Ознакомьтесь с документацией 

Đối với hầu hết các phần, bạn shouldn' t có bất kỳ lỗi nào trong việc xử lý chúng khác với chuỗi ascii trong mã này.

Có các biểu tượng khác mà bạn sẽ thấy, chẳng hạn như biểu tượng "thô" để yêu cầu một chuỗi không diễn giải bất kỳ ký tự đặc biệt nào. Điều này cực kỳ hữu ích khi thực hiện biểu thức chính quy trong python.

>>> 'foo\"' 
'foo"' 
>>> r'foo\"' 
'foo\\"' 

ACSII và chuỗi Unicode có thể một cách hợp lý tương đương:

>>> bird1 = unicode('unladen swallow') 
>>> bird2 = 'unladen swallow' 
>>> bird1 == bird2 
True 
+0

Cảm ơn bạn ..để làm cho nó rõ ràng, những gì tôi hiểu rằng tôi sẽ không nhận được lỗi hoạt động trên từ điển với chuỗi đại diện là unicode. – user1488987

+0

@ user1488987: Đúng. Bạn có thể có unicode trong dict – jdi

+3

@jdi, chuỗi ví dụ tuyệt vời :)) –

Các vấn đề liên quan