像VB6一样在python中为整数值获取相同的字符

时间:2019-02-04 09:58:55

标签: python vb6 i2c

我正在将VB6代码迁移到Python,其中包括创建ftd2xx.dll包装器。我使用示例来创建它。 DLL的写入功能的数据必须是字符串。我的问题是,对于某些字符,Python和VB6具有不同的符号,因此,它会将错误的数据写入设备。如何在Python中获得与从VB6中的chr()函数获得的相同字符?

VB6:

Private Sub AddToBuffer(AddWert As Long)
    OutIndex = OutIndex + 1             
    Mid(Out_Buffer, OutIndex, 1) = Chr(AddWert) 
End Sub

Python:

 def addToBuffer(self, AddWert):     
    self.outIndex += 1                  
    self.outBuffer = self.outBuffer + chr(AddWert)
    return None

1 个答案:

答案 0 :(得分:0)

我没有VB6,所以我无法猜测您在那里看到的字符:您说的是得到的意思,而不是您的期望

ASCII 0-31是控制字符:它们是非打印字符,换句话说,它们没有字形。例如,13是回车符,10是换行符。

字形VB6所显示的所有内容都是非标准的,您可能必须自己翻译。在Unicode表中搜寻字形,然后将它们放在dict中。

对于值128和更高(无论有人告诉您,在ASCII标准中为未定义),我猜测(再次)VB6将使用Windows 1252,尽管可能不在您的区域设置中:您会比我更了解。

这段代码将隐藏Windows 1252映射中可能包含的值,

for i in range(32, 256):
    try:
        print (i, bytes([i]).decode("windows-1252"))
    except UnicodeDecodeError:
        print (i, 'Not decodable')

这将为您提供我认为的期望,除了127(也是控制字符)和129、141、143、144和157(即使在Windows 1252中也似乎没有映射)。如果VB6显示字形对于他们,则使用与0-31相同的注释。顺便说一句,看起来160会产生空白或什么都不产生:不会。当然,这不容易看到,但这是一个不间断的空间。

因此,对于31以上的字符,代替

self.outBuffer = self.outBuffer + chr(AddWert)

您可以使用

self.outBuffer = self.outBuffer + bytes([AddWert]).decode("windows-1252")