Получить тот же символ для целочисленного значения в Python, как в VB6 - PullRequest
0 голосов
/ 04 февраля 2019

Я переношу код VB6 на Python, который включает в себя создание оболочки ftd2xx.dll.Я использовал примеры, чтобы создать это.Данные для функции записи DLL должны быть строкой.У меня проблема в том, что для некоторых символов Python и VB6 имеют разные знаки и из-за этого они записывают неверные данные на устройство.Как получить те же символы в Python, что и из функции chr () в VB6?

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 голосов
/ 04 февраля 2019

У меня нет VB6, поэтому я не могу угадать, какие символы вы видите там: вы сказали, что вы получаете , но не то, что вы ожидаете .

ASCII 0-31 являются управляющими символами: они не печатаются, другими словами, у них нет глифа.Например, 13 - это возврат каретки, а 10 - перевод строки.

Какой бы символ VB6 для них ни отображался, он нестандартный, и вам, вероятно, придется его переводить самостоятельно.Выследите глифы в таблице Unicode и поместите их в dict.

Для значений 128 и выше (которые, как кто-нибудь вам скажет, равны undefined в стандарте 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")
...