sys.argv 包含转义序列字符的字符串无法在 LCD 上正确显示
sys.argv string containing escape sequence characters won't display correctly on LCD
我正在尝试让一些文本显示在连接到 Raspberry Pi(使用 Adafruit_CircuitPython_CharLCD 库)的 16x2 LCD 上。当在我的代码中提供文本字符串时,一切正常,但是当 运行 脚本作为参数提供时,我无法正确显示 special/escape 个字符。
我尝试使用 os.fsencode(sys.argv[1])
将 sys.argv[1]
转换为字节,然后解码为 utf-8 或 ascii。
我在图书馆中搜索了任何特定的编码参考。我对编码了解不多。
#!/usr/bin/env python3
#lcd.py
import os, sys
from time import sleep
import board
import digitalio
import adafruit_character_lcd.character_lcd as characterlcd
#LCD setup
lcd_columns = 16
lcd_rows = 2
lcd_rs = digitalio.DigitalInOut(board.D5)
lcd_en = digitalio.DigitalInOut(board.D6)
lcd_d4 = digitalio.DigitalInOut(board.D13)
lcd_d5 = digitalio.DigitalInOut(board.D16)
lcd_d6 = digitalio.DigitalInOut(board.D19)
lcd_d7 = digitalio.DigitalInOut(board.D26)
lcd = characterlcd.Character_LCD_Mono(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows)
#Special character definitions
degree = bytes([0xc, 0x12, 0x12, 0xc, 0x0, 0x0, 0x0, 0x0])
lcd.create_char(0, degree)
def display(text):
lcd.clear()
lcd.message = text
if __name__ == '__main__':
display(" T: 19.5\x00C\nSet 21.0\x00C")
sleep(5)
display(sys.argv[1])
我这样称呼我的脚本:
$ python3 lcd.py " T: 19.5\x00C\nSet 21.0\x00C"
现在,它正确显示五秒钟:
T: 19.5°C
Set 21.0°C
然后展示这个美女:
T: 19.5¥x00C¥nS
第二行为空(\n 未被识别)。
如有任何帮助,我们将不胜感激。
谢谢!
问题是这一行:
" T: 19.5\x00C\nSet 21.0\x00C"
当它是 Python 文字时, 将 \x00
字符序列解释为 ASCII 0,您的设备将其显示为度数符号。
但是如果是命令行输入的数据那么\x00
就是4个字符\ x 0 0
。并且很难推荐一种解决方法,因为从命令行输入字符 null 很棘手。许多干预软件将该字符视为字符串终止符。因此,如果您必须使用 [=16=]
作为特殊字符代理项,让程序继续管理格式(空字符、回车符 returns、"Set" 和 "T:"),而您只需从命令行输入数字即可。将 display()
调用更改为
display(" T: {1}\x00C\nSet {2}\x00C".format(*sys.argv))
当你 运行 程序时,这样做:
$ python3 lcd.py 19.5 21.0
这是通过将两个温度作为单独的值传递到 sys.argv
中来实现的,format()
然后将其放入要显示的字符串中。
我正在尝试让一些文本显示在连接到 Raspberry Pi(使用 Adafruit_CircuitPython_CharLCD 库)的 16x2 LCD 上。当在我的代码中提供文本字符串时,一切正常,但是当 运行 脚本作为参数提供时,我无法正确显示 special/escape 个字符。
我尝试使用 os.fsencode(sys.argv[1])
将 sys.argv[1]
转换为字节,然后解码为 utf-8 或 ascii。
我在图书馆中搜索了任何特定的编码参考。我对编码了解不多。
#!/usr/bin/env python3
#lcd.py
import os, sys
from time import sleep
import board
import digitalio
import adafruit_character_lcd.character_lcd as characterlcd
#LCD setup
lcd_columns = 16
lcd_rows = 2
lcd_rs = digitalio.DigitalInOut(board.D5)
lcd_en = digitalio.DigitalInOut(board.D6)
lcd_d4 = digitalio.DigitalInOut(board.D13)
lcd_d5 = digitalio.DigitalInOut(board.D16)
lcd_d6 = digitalio.DigitalInOut(board.D19)
lcd_d7 = digitalio.DigitalInOut(board.D26)
lcd = characterlcd.Character_LCD_Mono(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows)
#Special character definitions
degree = bytes([0xc, 0x12, 0x12, 0xc, 0x0, 0x0, 0x0, 0x0])
lcd.create_char(0, degree)
def display(text):
lcd.clear()
lcd.message = text
if __name__ == '__main__':
display(" T: 19.5\x00C\nSet 21.0\x00C")
sleep(5)
display(sys.argv[1])
我这样称呼我的脚本:
$ python3 lcd.py " T: 19.5\x00C\nSet 21.0\x00C"
现在,它正确显示五秒钟:
T: 19.5°C
Set 21.0°C
然后展示这个美女:
T: 19.5¥x00C¥nS
第二行为空(\n 未被识别)。
如有任何帮助,我们将不胜感激。 谢谢!
问题是这一行:
" T: 19.5\x00C\nSet 21.0\x00C"
当它是 Python 文字时, 将 \x00
字符序列解释为 ASCII 0,您的设备将其显示为度数符号。
但是如果是命令行输入的数据那么\x00
就是4个字符\ x 0 0
。并且很难推荐一种解决方法,因为从命令行输入字符 null 很棘手。许多干预软件将该字符视为字符串终止符。因此,如果您必须使用 [=16=]
作为特殊字符代理项,让程序继续管理格式(空字符、回车符 returns、"Set" 和 "T:"),而您只需从命令行输入数字即可。将 display()
调用更改为
display(" T: {1}\x00C\nSet {2}\x00C".format(*sys.argv))
当你 运行 程序时,这样做:
$ python3 lcd.py 19.5 21.0
这是通过将两个温度作为单独的值传递到 sys.argv
中来实现的,format()
然后将其放入要显示的字符串中。