🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Linux Mint

Linux Mintは、使いやすいLinuxシステムの提供を目的としたLinuxディストリビューションです。UbuntuとDebianをベースにしており、Ubuntuのリポジトリを共有しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Arch Linux

arch(アーク)は、バージョン管理システムです。 また、リポジトリ(アーカイブ)操作を行えるツールの総称として扱われています。

Gentoo Linux

Gentooは、Linuxディストリビューションの1つです。 GTK+で作られてファイルマネージャです。

Q&A

解決済

1回答

3081閲覧

文字コード UnicodeDecodeError: 'cp932' codec can't decode byte 0x83 illegal multibyte seq

退会済みユーザー

退会済みユーザー

総合スコア0

Linux Mint

Linux Mintは、使いやすいLinuxシステムの提供を目的としたLinuxディストリビューションです。UbuntuとDebianをベースにしており、Ubuntuのリポジトリを共有しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Arch Linux

arch(アーク)は、バージョン管理システムです。 また、リポジトリ(アーカイブ)操作を行えるツールの総称として扱われています。

Gentoo Linux

Gentooは、Linuxディストリビューションの1つです。 GTK+で作られてファイルマネージャです。

0グッド

0クリップ

投稿2019/09/08 02:54

編集2019/09/08 03:01

#実行環境 LINUX CENTOS7

お世話になります。linux環境で文字コードエラーが解けず困っています。初学な質問となり申し訳ありませんがよろしくお願いいたします。

#やりたいこと all_textに中身を全て格納したい

まずwin環境では正常に動くコードになっております。しかしlinux環境ですと何度試しても以下エラーになってしまいます。

#エラー内容

all_text = all_text + n.decode("cp932") UnicodeDecodeError: 'cp932' codec can't decode byte 0x83 in position 33: illegal multibyte sequence

なお以下pの中にはhoge.txtのように.txtの内容が入ります。

#ためしたコード

cmd = "python3 ./hoge.py gs://bucket/" p = subprocess.Popen(cmd.split(), stderr=subprocess.PIPE, stdout=subprocess.PIPE) stdout = p.communicate() all_text = "" for n in stdout: # print("hoge ",n.decode("cp932")) all_text = all_text + n.decode("cp932")

大変稚拙な質問となりお手数をおかけいたしますがよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

subprocess.Popenで実行したプロセスが出力したデータがWindows環境ではcp932であるのに対し、Linux環境ではUTF-8になることが原因だと思います。その場合、n.decode("cp932")n.decode('UTF-8')に変える必要があります。

どちらでも動くようにしたいのであれば

Python

1import locele

をソースの冒頭でして、n.decode(locale.getpreferredencoding())と書いてください。

投稿2019/09/08 03:23

nomuken

総合スコア1627

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/09/08 03:27

うわすごい。すぐ試します。またご連絡させて頂きます。ありがとうございます
退会済みユーザー

退会済みユーザー

2019/09/08 03:43

いつもありがとうございます。できました。linuxとwinでコマンドの打ち方や今回のケースなどで違う時はどのように設定されてますか?私は以下コードなのですがかなり不安を覚えておりぜひ教えて頂きたいです。 if os.name == 'nt': else:
nomuken

2019/09/08 03:59

そういったケースのノウハウは持ってません。 今回のケースは子プロセスが出力する文字列のエンコードは何かという問題でそれ自体はPythonとはあまり関係ありません。Windowsの場合はコードページに従いますし、Linuxの場合は変数LANGに従います。 この違いをいちいち実装していては面倒です。ただ、Pythonの場合はlocaleパッケージがそれを解決する機能を持っているとわかったのでそれを使った実装を提案しました。
nomuken

2019/09/08 04:09 編集

調べたところPython実行プログラムのパスを取得する方法があります。 それを実行プログラムパスとして使えばこれについてはWindowsとLinuxの違いを気にしなくてよくなるのではないかと思います。 import sys print(sys.executable)
退会済みユーザー

退会済みユーザー

2019/09/08 04:36

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問