Python 2 中的 Unicode 到 ASCII 字符串
Unicode to ASCII string in Python 2
正在尝试在墙上显示选定机场的当前 MET 数据。
这是我第一次使用 Raspberry Pi 3 和 Python.
计划是从网络数据提供者读取并在 LCD 显示器上显示选定的数据。
LCD 库似乎只能在 Python2 中工作。 Json数据在Python3中似乎更容易处理。
这个问题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
您传递的是 元组 ,而不是单个字符串:
str1 = data["Altimeter"], data["Units"]["Altimeter"]
mylcd.lcd_display_string()
需要一个字符串。也许您打算连接两个字符串:
str1 = data["Altimeter"] + data["Units"]["Altimeter"]
Python 2 会将 Unicode 字符串隐式编码为需要字节字符串的 ASCII 字节字符串;如果你的数据不是 ASCII 编码的,你必须自己编码你的数据,使用 suitable 编解码器,将你的 Unicode 代码点映射到 LCD 显示器的正确字节(我相信你可以有不同的字符集存储在 ROM 中)。这可能需要手动翻译 table,因为 non-ASCII LCD ROM 字符集很少与标准编解码器相对应。
如果您只想强制字符串仅包含 ASCII 字符,请将错误处理程序设置为 'ignore':
进行编码
str1 = (data["Altimeter"] + data["Units"]["Altimeter"]).encode('ASCII', 'ignore')
没有看到mylcd.lcd_display_string()
的内部,有点难以分辨,但我认为问题出在这里:
str1 = data["Altimeter"], data["Units"]["Altimeter"]
我怀疑您希望 str1
包含字符串类型的内容,其值类似于“132 米”。尝试在后面添加一条 print 语句,以便您可以看到 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'>.
提及"type tuple"、括号和逗号表示str1 不是字符串。
问题是打印语句中的逗号没有做连接,这可能是您所期望的。它将两个值连接成一个元组。连接起来,灵活且足够的方法是使用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()
一起工作。
正在尝试在墙上显示选定机场的当前 MET 数据。
这是我第一次使用 Raspberry Pi 3 和 Python.
计划是从网络数据提供者读取并在 LCD 显示器上显示选定的数据。
LCD 库似乎只能在 Python2 中工作。 Json数据在Python3中似乎更容易处理。
这个问题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
您传递的是 元组 ,而不是单个字符串:
str1 = data["Altimeter"], data["Units"]["Altimeter"]
mylcd.lcd_display_string()
需要一个字符串。也许您打算连接两个字符串:
str1 = data["Altimeter"] + data["Units"]["Altimeter"]
Python 2 会将 Unicode 字符串隐式编码为需要字节字符串的 ASCII 字节字符串;如果你的数据不是 ASCII 编码的,你必须自己编码你的数据,使用 suitable 编解码器,将你的 Unicode 代码点映射到 LCD 显示器的正确字节(我相信你可以有不同的字符集存储在 ROM 中)。这可能需要手动翻译 table,因为 non-ASCII LCD ROM 字符集很少与标准编解码器相对应。
如果您只想强制字符串仅包含 ASCII 字符,请将错误处理程序设置为 'ignore':
进行编码str1 = (data["Altimeter"] + data["Units"]["Altimeter"]).encode('ASCII', 'ignore')
没有看到mylcd.lcd_display_string()
的内部,有点难以分辨,但我认为问题出在这里:
str1 = data["Altimeter"], data["Units"]["Altimeter"]
我怀疑您希望 str1
包含字符串类型的内容,其值类似于“132 米”。尝试在后面添加一条 print 语句,以便您可以看到 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'>.
提及"type tuple"、括号和逗号表示str1 不是字符串。
问题是打印语句中的逗号没有做连接,这可能是您所期望的。它将两个值连接成一个元组。连接起来,灵活且足够的方法是使用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()
一起工作。