簡體   English   中英

Python 2中的Unicode到ASCII字符串

[英]Unicode to ASCII string in Python 2

嘗試在牆上顯示所選機場的當前MET數據。 這是我第一次使用Raspberry Pi 3和Python。
計划是從網絡數據提供商處讀取數據,並將選定的數據顯示在LCD顯示屏上。

LCD庫似乎僅在Python2中有效。 Json數據似乎在Python3中更容易處理。

這個問題python json加載unicode可能解決了我的問題,但是我不理解該怎么做。

那么,我該如何處理我的代碼?

展示我的問題的最小示例:

#!/usr/bin/python
import I2C_LCD_driver
import urllib2
import urllib
import json

mylcd = I2C_LCD_driver.lcd()

mylcd.lcd_clear()

url = 'https://avwx.rest/api/metar/ESSB'
request = urllib2.Request(url)
response = urllib2.urlopen(request).read()
data = json.loads(response)

str1 = data["Altimeter"], data["Units"]["Altimeter"]

mylcd.lcd_display_string(str1, 1, 0)

錯誤如下:

$python Minimal.py
Traceback (most recent call last):
  File "Minimal.py", line 18, in <module>
    mylcd.lcd_display_string(str1, 1, 0)
  File "/home/pi/I2C_LCD_driver.py", line 161, in lcd_display_string
    self.lcd_write(ord(char), Rs)
TypeError: ord() expected a character, but string of length 4 found

您要傳入一個元組 ,而不是一個字符串:

str1 = data["Altimeter"], data["Units"]["Altimeter"]

mylcd.lcd_display_string()期望使用單個字符串。 也許您打算將兩個字符串連接起來:

str1 = data["Altimeter"] + data["Units"]["Altimeter"]

Python 2將隱式地將Unicode字符串編碼為ASCII字節字符串,其中應有一個字節字符串。 如果您的數據不是ASCII可編碼的,則必須使用一種合適的編解碼器自己對數據進行編碼,該編解碼器會將Unicode代碼點映射到LCD顯示器的正確字節(我相信您可以在ROM中存儲不同的字符集)。 由於非ASCII LCD ROM字符集很少與標准編解碼器相對應,因此這可能涉及手動翻譯表。

如果只想強制字符串僅包含ASCII字符,則將錯誤處理程序設置為'ignore'進行編碼:

str1 = (data["Altimeter"] + data["Units"]["Altimeter"]).encode('ASCII', 'ignore')

不看mylcd.lcd_display_string()的內部很難說mylcd.lcd_display_string() ,但是我認為問題出在這里:

str1 = data["Altimeter"], data["Units"]["Altimeter"]

我懷疑您希望str1包含字符串類型的內容,其值類似於“ 132米”。 嘗試在str1其后添加打印語句,以便可以看到str1包含的內容。

str1 = data["Altimeter"], data["Units"]["Altimeter"]
print( "str1 is: {0}, of type {1}.".format(str1, type(str1)) )

我認為您會看到類似以下結果:

str1 is: ('foo', 'bar'), of type <type 'tuple'>.

提及“類型元組”,括號和逗號表示str1不是字符串。

問題在於,print語句中的逗號不進行串聯,這也許就是您所期望的。 它將兩個值合並為一個元組。 要進行串聯,一種靈活而充分的方法是使用str.format()方法:

str1 = "{0} {1}".format(data["Altimeter"], data["Units"]["Altimeter"])
print( "str1 is: {0}, of type {1}.".format(str1, type(str1)) )

然后,我希望您會看到如下結果:

str1 is: 132 metres, of type <type 'str'>.

該類型“ str”的值應與mylcd.lcd_display_string()一起mylcd.lcd_display_string()工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM