Python 2中的Unicode到ASCII字符串

时间:2018-04-08 09:12:22

标签: python json i2c

尝试在选定的机场进行当前MET数据的墙面显示。 这是我第一次使用Raspberry Pi 3和Python 计划是从网络数据提供商处读取并在LCD显示器上显示所选数据。

LCD库似乎只适用于Python2。在Python3中,Json数据似乎更容易处理。

这个问题python json loads 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

2 个答案:

答案 0 :(得分:1)

您传入元组,而不是单个字符串:

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字符,请将错误处理程序设置为&#39;忽略&#39;:

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

答案 1 :(得分:1)

如果没有看到mylcd.lcd_display_string()的内部,有点难以辨别,但我认为问题在于:

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

我怀疑你希望str1包含类型字符串的东西,其值类似于“132米”。尝试添加打印语句,以便您可以看到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()一起使用。