我正在将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
答案 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")