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

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

ただいまの
回答率

89.98%

pythonでpost通信のデータが日本語にできずに困っている。

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 898

meJ15

score 41

前提・実現したいこと

chromeで入力した3つの日本語をpythonでバイト型から日本語に変換できずに困っています。
参考ページ
「Unicodeエスケープされた文字列を通常の文字列に変換」
でできると思っていましたがうまく動きません。

![イメージ説明]

この画像のようになってしまいます。
html側では「あいう」という文字をconsole.logで確認できています。

これをPOSTメソッドで送るときにバイト型に変換されて、それをpython側で上手く日本語化できていません。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

$("#submit").click(function(){
    var val1 = $('#my-form [name=name1]').val();
    console.log(val1);
    var val2 = $('#my-form [name=name2]').val();
    console.log(val2);
    var val3 = $('#my-form [name=name3]').val();
    console.log(val3);
    event.preventDefault();

//送る文字列定義
    var kei = val1 +","+ val2 +","+ val3;
    console.log(kei);
    var $SCRIPT_ROOT = {{ request.script_root|tojson|safe }};
    $.ajax({
      type: "POST",
      url: $SCRIPT_ROOT + "/predict/",
      data:kei ,

      success: function(data){
        $('#result').text(' 推測結果: '+data);
      },
      error: function(data){
         $('#result').text('データ不足です');
      }
    });
});
@app.route('/predict/',methods=['GET','POST'])
def predict():
    #print((request.get_data()).decode('utf-8'))
    #一次元の配列
    label = (request.get_data()).decode('utf-8')
    lablel = label.encode().decode('unicode-escape')
    shape = str(type(label))
    percent = 1
    percent = round(float(percent)*100,1)
    percent = str(percent)
    return json.dumps({
        "label":label,
        "shape":shape,
        "percent":percent+"%"
    })

試したこと

python側を下のようにすると
label = (request.get_data()).decode('unicode-escape')

label:
\u00e3\u0081\u0082,\u00e3\u0081\u0084,\u00e3\u0081\u0086", 
となります。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Lhankor_Mhy

    2018/12/28 18:30

    lablel となっているのは typo ですか?

    キャンセル

回答 1

checkベストアンサー

0

提示コードでの動作は未検証ですが、json.dumpsする場合、ensure_ascii=Falseを指定しないと日本語が文字化けしますので指定してみてください。
また、lablel = label.encode().decode('unicode-escape')行は不要です。
参考:Flask で Restful API を作る - jsonify で日本語が文字化けする時の解決方法

以下検証コードです。

from flask import Flask, request
app = Flask(__name__)

import json

@app.route('/')
def hello_world():
    # ブラウザ上では「["abc","あいう"」」と表示される
    # 未指定だと「["abc", "\u3042\u3044\u3046"]」と表示される
    ret = json.dumps(['abc','あいう'], ensure_ascii=False)
    return ret

if __name__ == '__main__':
    app.run(debug=True)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる