我正在将一段VB6代码迁移到Python,其中包括创建一个ftd2xx.dll包装器。我已经使用了一些例子来创建它。DLL的write函数的数据必须是字符串。我遇到的问题是,对于某些字符,Python和VB6有不同的符号,因此,它会将错误的数据写入设备。如何在Python中获得与VB6中的chr()函数相同的字符?
VB6:
Private Sub AddToBuffer(AddWert As Long)
OutIndex = OutIndex + 1
Mid(Out_Buffer, OutIndex, 1) = Chr(AddWert)
End SubPython:
def addToBuffer(self, AddWert):
self.outIndex += 1
self.outBuffer = self.outBuffer + chr(AddWert)
return None发布于 2019-02-04 18:50:07
我没有VB6,所以我猜不出你在那里看到的是什么字符:你说你得到了什么,但没有说你想要什么。
ASCII0-31是控制字符:它们是非打印的,换句话说,它们没有字形。例如,13是回车符,10是换行符。
VB6为这些字符显示的任何字形都是非标准的,您可能必须自己翻译它们。在Unicode表中搜索字形,并将它们放入dict中。
对于128及以上的值(不管别人怎么告诉你,它在ASCII标准中都没有定义),我猜测(再一次) VB6会使用Windows1252,尽管可能不是在你的地区:你会比我更清楚这一点。
这段代码将转换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")https://stackoverflow.com/questions/54513705
复制相似问题