71749


16進Hexコード「5e 3d c3 bd c4 5e c3 bd c4 1b 24 42 23 36 1b 28 4a
20」を日本語で「^=ﾃｽﾄ^ﾃｽﾄ６」と表現できるのですが、encode、decodeを駆使しutf-8,unucode,ISOなど使用し変換を試みているのですが半角文字「ﾃｽﾄ^ﾃｽﾄ」のみ出たり全角の「６」だけでたりでなかなか「^=ﾃｽﾄ^ﾃｽﾄ６」と出てくれません。  
どの様にすれば表現できますでしょうか。  
ご教授頂ければ幸いです


CC BY-SA 4.0
2020-11-05T06:34:28.227
71744
2020-11-05T11:56:40.847
2020-11-05T07:22:10.823
3060
42610
question
python python3
16進Hexコードを変換して日本語表記したい。


5e : Shift-JISの `^`  
3d : Shift-JISの `=`  
c3 : Shift-JISの `ﾃ`  
bd : Shift-JISの `ｽ`  
c4 : Shift-JISの `ﾄ`  
5e : Shift-JISの `^`  
c3 : Shift-JISの `ﾃ`  
bd : Shift-JISの `ｽ`  
c4 : Shift-JISの `ﾄ`  
1b 24 42 : ISO-2022-JPのJIS X 0208:1990への切り替え指示  
23 36 : JIS X 0208:1990の `６`  
1b 28 4a : ISO-2022-JPのJIS C 6220-1976への切り替え指示  
20 : JIS C 6220-1976の ` `（空白）

と複数の文字コードが混在しています。文字コードを理解した上で変換を行う必要があります。


CC BY-SA 4.0
2020-11-05T07:33:56.960
71747
2020-11-05T07:33:56.960
4236
71744
answer


`iso-2022-jp-ext`というのが使えるようです。

[半角カナありiso-2022-jpエンコーディング](http://tanakahisateru.hatenablog.jp/entry/20080720/1216565211)

> 万全を期すなら、使用できない文字をフィルタするべきですが、「とりあえず動く」Pythonicな現実解プログラムを書くための現実解としては、
[code]

>     u'ﾊﾝｶｸ'.encode('iso-2022-jp-ext')
>  
[/code]

>
> とします。これで、他の日本語エンコーディングで入力された任意の文字列を、とりあえずiso-2022-jpとして扱うことができます。

上記を応用して、いったん`0x80`以上を`cp932`で`decode`し、`iso-2022-jp-
ext`で`encode`し直すことでデータを変換し、再度`iso-2022-jp-ext`で`decode`すれば出来るでしょう。  
変更：半角カナが連続しても全て1文字毎に切り替えて冗長だったのを整理

[code]

    data = b'\x5e\x3d\xc3\xbd\xc4\x5e\xc3\xbd\xc4\x1b\x24\x42\x23\x36\x1b\x28\x4a\x20'
    
    work = []
    kana = []
    for b in data:
      if b < 0x80:
        if kana:
          work.extend(bytes(kana).decode('cp932').encode('iso-2022-jp-ext'))
          kana = []
        work.append(b)
      else:
        kana.append(b)
    
    if kana:
      work.extend(bytes(kana).decode('cp932').encode('iso-2022-jp-ext'))
    
    newdata = bytes(work)
    
    newdata.decode('iso-2022-jp-ext')
    
[/code]


CC BY-SA 4.0
2020-11-05T08:23:01.937
71749
2020-11-05T11:56:40.847
2020-11-05T11:56:40.847
26370
26370
71744
answer


参考までに、こちらは X Window System の [Compound Text
Encoding](https://www.x.org/releases/X11R7.6/doc/xorg-
docs/specs/CTEXT/ctext.html) ではないかと推察します。

[CompoundText(通信用語の基礎知識)](https://www.wdic.org/w/WDIC/CompoundText)

> 特徴
>
> EUCと異なり、何ヶ国語でも混在が可能である。
>
> そこでX Window Systemでは、クライアント(X Window Systemの元で動くプログラム)同士のデータ受け渡しを一旦Compound
> Textに変換して行なっている。こうすれば個々のクライアントが内部でどのような文字コードを使っていても、矛盾なくデータの受け渡しが可能になる。

参考までに、この「文字列」を Emacs(X Window System version) で表示してみます。

[code]

    $ printf $'\x5e\x3d\xc3\xbd\xc4\x5e\xc3\xbd\xc4\x1b\x24\x42\x23\x36\x1b\x28\x4a\x20\n' > a.txt
    
[/code]

Emacs で a.txt を読み込んで表示

[![compound
text](https://i.stack.imgur.com/ZfQdH.png)](https://i.stack.imgur.com/ZfQdH.png)

Python で compound text を扱う事が可能なパッケージがあれば、エンコーディングの変換は可能かもしれません。


CC BY-SA 4.0
2020-11-05T09:13:17.477
71751
2020-11-05T09:13:17.477
71744
answer