包含转义序列字符的sys.argv字符串无法在LCD上正确显示

时间:2019-02-06 16:57:58

标签: python python-3.x character-encoding sys

我试图使一些文本显示在连接到Raspberry Pi的16x2 LCD上(使用Adafruit_CircuitPython_CharLCD库)。在代码中提供文本字符串后,一切正常,但是在运行脚本时将其作为参数提供时,无法获得特殊/转义字符以正确显示。

我尝试使用sys.argv[1]os.fsencode(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无法识别)。

任何帮助将不胜感激。 谢谢!

1 个答案:

答案 0 :(得分:0)

问题是这一行:

Id
1     True
2    False
3    False
4     True
5    False

当它是Python文字时RangeAssignor字符序列解释为ASCII 0,您的设备将其显示为度数符号。

但是当在命令行上输入数据时,则" T: 19.5\x00C\nSet 21.0\x00C" 表示4个字符\x00。很难推荐一种解决方法,因为从命令行输入字符null很难。许多干预软件都将该字符视为字符串终止符。因此,如果您必须使用\x00作为特殊字符替代,让程序继续管理格式(空字符,回车符,“ Set”和“ T:”),而您只需从命令行。将\ x 0 0调用更改为

\00

,然后在运行程序时按以下步骤操作:

display()

这是通过将两个温度作为单独的值传入display(" T: {1}\x00C\nSet {2}\x00C".format(*sys.argv)) ,然后将$ python3 lcd.py 19.5 21.0 放入要显示的字符串中来实现的。