前提・実現したいこと
サーバー(Python)とクライアント(ブラウザ、Javascript)の間でWebSocketを通じた双方向の文字列交換をするプログラムを現在作っています。
サーバー側で、クライアント側から投げられた日本語を含む文字列をそのまま解釈しようとすると文字化けを起こしてしまうので、いろいろ調査した結果
Python
1x = '{"comment":"ç´èã»ã»ã»","command":"test","ch":1}' #クライアント側から受け取った文字化けした文字列 2x = x.encode('unicode-escape') # b'{"comment":"\xe7\x90\xb4\(以下略) という結果になる 3x = x.decode('utf-8') 4print (x) 5#期待する出力は {"comment":"琴葉・・・","command":"test","ch":1} 6#実際の出力は {"comment":"\xe7\x90\xb4(以下略)
というようにunicode-escapeの形に直してやってから、それをutf-8として解釈させることで文字化けを解消する方法を思いつきました。
しかし2行目のencode()を行うと頭にバックスラッシュが2つ入り、3行目のdecode()で正しく変換されません。byte型の時点で b'\xe7\x90\xb4' のように、バックスラッシュが1つだけであれば正しくdecode()ができることを確認できたので、そこで2行目のencodeの直後に''を''に置換させる処理を置こうと試しているのですがどうもうまくいかないのです。
発生している問題
File "n.py", line 2 x = x.replace(b'\',b'\') ^ SyntaxError: EOL while scanning string literal
調べてみるとなぜ raw 文字列 (r-strings) はバックスラッシュで終わってはいけないのですか?という記述を見つけました。それによると
正確には、奇数個のバックスラッシュで終わってはいけません。終わりの対になっていないバックスラッシュは、閉じ引用文字をエスケープし、終っていない文字列を残してしまいます。
とのことでした。現在エラーが起きている箇所はbyte型で、この問題に関係あるのかないのかは正直自分でもわからないのですが、関係あるとしたら「閉じ引用文字をエスケープしてエラーが起きている」ということが今回の場合でもいえそうです。もしそうであった場合は置換に際して回避策、代替策などはあるのでしょうか?
該当のソースコード
python
1x = '{"comment":"ç´èã»ã»ã»","command":"test","ch":1}'.encode('unicode-escape') 2x = x.replace(b'\',b'\') 3x = x.decode('utf-8') 4print (x)
補足情報(FW/ツールのバージョンなど)
検証環境:
・Python 3.7.4
・Windows 10 Home(64bit)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。