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() 然后将其放入要显示的字符串中。