-2

ISO-8859-2 (latin-2) 文字 (ISO-8859-2 でエンコードされた文字を表す整数または 16 進数値を意味します) を UTF-8 文字に変換するにはどうすればよいでしょうか。

私のプロジェクトでPythonで行う必要があること:

  1. ISO-8859-2 でエンコードされた文字であるシリアル ポートから 16 進値を受け取ります。
  2. それらをデコードします。これは、「標準の」Python Unicode 文字列を取得することです。
  3. xml ファイルを準備して書き込みます。

Python 3.4.3 の使用

txt_str = "ąęłóźć"
txt_str.decode('ISO-8859-2')
Traceback (most recent call last): File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'decode'

主な問題は、「デコード」メソッドの有効な入力を準備することです (これは python 2.7.10 で動作し、このプロジェクトで使用しているものです)。Latin-2 コード番号である 10 進数値から有効な文字列を準備するにはどうすればよいですか?

私が使用しているデバイスと通信プロトコルの制限のおかげで、シリアルポートからutf-8文字を受信するのは非常に複雑になることに注意してください。

サンプルデータ、ご要望に応じて:

68632057
62206A75
7A647261
B364206F
20616775
777A616E
616A2061
6A65696B
617A20B6
697A7970
6A65B361
70697020
77F36469
62202C79
6E647572
75206A65
7963696C
72656D75
6A616E20
73726F67
206A657A
65647572
77207972
73772065
00000069

これはサンプルデータです。ISO-8859-2 が uint32 にプッシュされ、int あたり 4 文字。

ボックス化解除を管理するコードのビット:

l = l[7:].replace(",", "").replace(".", "").replace("\n","").replace("\r","") # crop string from uart, only data left
vl = [l[0:2], l[2:4], l[4:6], l[6:8]] # list of bytes
vl = vl[::-1] # reverse them - now in actual order

16進文字列から整数値を取得するには、次のように簡単に使用できます。

int_vals = [int(hs, 16) for hs in vl]
4

3 に答える 3

2

興味深いサンプル データ。理想的には、サンプル データは、PySerial から受け取った生データを直接出力する必要があります。生のバイトを 8 桁の 16 進数値として実際に受け取っている場合は、次のようになります。

#!python3
from binascii import unhexlify
data = b''.join(unhexlify(x)[::-1] for x in b'''\
68632057
62206A75
7A647261
B364206F
20616775
777A616E
616A2061
6A65696B
617A20B6
697A7970
6A65B361
70697020
77F36469
62202C79
6E647572
75206A65
7963696C
72656D75
6A616E20
73726F67
206A657A
65647572
77207972
73772065
00000069'''.splitlines())

print(data.decode('iso-8859-2'))

出力:

W chuj bardzo długa nazwa jakiejś zapyziałej pipidówy, brudnej ulicyumer najgorszej rudery we wsi

ポーランド語から英語への Google 翻訳:

The dick very long name some zapyziałej Small Town , dirty ulicyumer worst hovel in the village
于 2016-02-03T03:24:31.973 に答える
2

str を使用してバイトを保持しようとしたため、この例は機能しません。Python 3 では、文字列を使用する必要がありbyteます。

実際には、PySerial を使用している場合は、必要に応じて変換できるバイト文字列を読み取ることになります。

with serial.Serial('/dev/ttyS1', 19200, timeout=1) as ser:
    s = ser.read(10)
    # Py3: s == bytes
    # Py2.x: s == str
    my_unicode_string = s.decode('iso-8859-2')

iso-8895-2 データが実際にバイトの ASCII 16 進表現にエンコードされている場合は、エンコードの追加レイヤーを適用する必要があります。

with serial.Serial('/dev/ttyS1', 19200, timeout=1) as ser:
    hex_repr = ser.read(10)
    # Py3: hex_repr == bytes
    # Py2.x: hex_repr == str

    # Decodes hex representation to bytes
    # Eg. b"A3" = b'\xa3'
    hex_decoded = codecs.decode(hex_repr, "hex") 
    my_unicode_string = hex_decoded.decode('iso-8859-2')

これで、my_unicode_string をお気に入りの XML ライブラリに渡すことができます。

于 2016-02-02T08:52:43.333 に答える
-1

このトピックは終了しました。実行する必要があることを処理する作業コード:

x=177
x.to_bytes(1, byteorder='big').decode("ISO-8859-2")
于 2016-02-02T09:43:16.263 に答える