質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

585閲覧

jQuerryを用いたJS-Python間でのデータ授受における文字化け

cellostar

総合スコア11

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/05/28 11:31

JSやPythonについて知識が少ないため、頓珍漢なことを書いている箇所もあるかと思います。
また、このサイトを利用するのは初めてで、様式等不備があるかもしれません。
申し訳ありませんが、ご容赦ください。

<環境>
XAMPP 8.1.6
Anaconda 4.12.0(Python 3.9.12)
VSCode 1.67.2
Firefox 100.0.2
Google Chrome 102.0.5005.61

<やりたいこと>
JSからデータを投げてPythonで処理し、結果を受け取る

<コード>
ともにutf-8で保存している

JavaScript

1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="utf-8"> 5 6 <title>Ajax Sample1</title> 7</head> 8<body> 9 <button id="button">送信</button> 10 <div><br></div> 11 <div id="result">送信ボタンをクリックしてください。Ajax通信します。</div> 12 <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> 13 <script> 14 // jQuery 15 $(function () { 16 $("#button").click(function (event) { 17 $.ajax({ 18 type: "post", 19 url: "recieve.py", 20 data: '送信メッセージ' 21 }) 22 // Ajaxリクエストが成功した場合 23 .done(function (data) { 24 console.log(data); 25 }) 26 // Ajaxリクエストが失敗した場合 27 .fail(function (XMLHttpRequest, textStatus, errorThrown) { 28 alert(errorThrown); 29 }); 30 }); 31 }); 32 </script> 33</body> 34</html>

Python

1#!C:/Users/***/.conda/envs/py3912/python.exe 2# coding: utf-8 3 4import sys 5 6recieve = sys.stdin.readline() 7recieve = recieve + "です!" 8 9print('Content-Type: text/html;charset=utf-8\n') 10print(recieve) 11print('あ'.encode())

<問題>
上の状態で実行すると、ブラウザのコンソールには以下のように表示される。

Console1

1送信メッセージ�ł�! 2b'\xe3\x81\x82'

e38182は確かにutf-8で「あ」を表す。
しかし、そのまま表示しようとすると、「です」の部分のように文字化けしてしまう。
(また、「ソ」(sjis:835C)を表示しようとするとバックスラッシュ(sjis:5C)が表示された。)

<試したこと>
・Pythonのcharsetを「=shift_jis」にしてみる
→実行結果は以下のようになる。Pythonで追加した文字が正しく表示され、JSから送った文字が化ける

Console2

1騾∽ソ。繝。繝�そ繝シ繧クです! 2b'\xe3\x81\x82'

・jQuerryに、overrideMimeTypeでcharsetを指定してみる
→utf-8を指定した場合は最初(Console1)と同じ結果、shift_jisを指定した場合は前項(Console2)と同じ結果

<まとめ>
同様の事例を検索しつつ色々と試しましたが、解決できませんでした。Python上のrecieveの中身は、前半(JS由来)がutf-8、後半(Pythonで追加)がshift_jisになっているということなのでしょうか。ソースファイル自体も、冒頭の宣言もutf-8なのに、一体どこからshift_jisが出てくるのか、理解不能です...
なぜこのような現象が起こるのか、どうすれば解決できるのか、ご教授いただけますと幸いです。

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

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

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

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

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

guest

回答1

0

自己解決

早速の情報をありがとうございます。
リンク先の内容を参考に検証しましたところ、今回の場合では

Python

1sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')

の1行だけを最初に追加しましたところ、文字化けが解消されました!
(リンク先ではstdoutについても同様の設定をしていましたが、それを含めると今回は全体が文字化けするようになってしまい、不適当なようでした。)

Pythonの出力の問題かとは思い、少し調べてはいたのですが、「最近のバージョンのPythonではデフォルト文字コードの変更ができなくなった」のような情報を見つけたところで行き詰まってしまっていました。

要求・応答のバイト列を調べるということも、今後の参考になりました。アドバイスをくださったお二方、心より御礼申し上げます。

投稿2022/05/28 12:37

cellostar

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問