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

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

ただいまの
回答率

88.77%

Python3で文字コード関連のエラーが出てしましました

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,310

cray123

score 47

DjangoでAPIを叩くAPIを実装しているのですが、文字コード関連のエラーが出力されてしまいます

以下が処理の流れで、No.2が実装対象です

  1. クライアント(コンソール)がPOSTメソッドでリクエストボディに '{"test": "はろー"}' を含めて送信
  2. リクエストボディ '{"test": "はろー"}'の"はろー"を取得して、叩くAPIのリクエストボディに含めて送信
  3. jsonが返却される

リクエストボディのvalueが"はろー"ではなく"hello"などアルファベットの場合はエラーは出力されません
乱文で申し訳ありませんが、よろしくお願いします。

試したこと

'# -*- coding: utf-8 -*-の記述や、デフォルトをutf-8に変更しても変化がありませんでした

環境

CentOS7.6
Django2.1
Python3

terateam(クライアント)

エラー

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 20-22: Body ('はろー') is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8.

クライアントのcURLコマンド

curl -XPOST http://192.168.1.01:8000/ -H "Content-type: application/json" -d '{"test": "はろー"}'

リクエストの処理

def test(request):

    if request.method == 'POST':

        req_decode = request.body.decode('utf-8')
        req = json.loads(req_decode)

        value = req['test']

        url = 'http://fqdn(API)/'
        header = {'content-type':'application/json'}
        body = '{"test": "'+value+'"}'

        res = requests.post(url, headers=header, data=body)
        return render_json_response(request, res.json())

返す時

def render_json_response(request, data, status=None):
    """response を JSON で返却"""
    json_str = json.dumps(data, ensure_ascii=False, indent=2) #indent=2

    response = HttpResponse(json_str, content_type='application/json; charset=UTF-8', status=status)
    return response
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • quickquip

    2019/03/11 17:41

    実行しているアカウントのlocaleはわかりますか? エラーのバックトレース全部あったほうがいいと思います。

    キャンセル

  • cray123

    2019/03/11 17:53

    すみません、localeは何を指しているのでしょうか
    Djangoのsetting.pyの言語設定は以下のとおりです
    LANGUAGE_CODE = 'en-us'

    キャンセル

  • pepperleaf

    2019/03/11 20:37

    > LANGUAGE_CODE = 'en-us'
    英文設定ですね。
    エラーもそのまんま、
    > UnicodeEncodeError: 'latin-1' codec can't encode characters
    latin-1 .. つまり英文指定。

    キャンセル

  • cray123

    2019/03/12 15:26

    ご返信有難うございます
    > LANGUAGE_CODE = 'ja'
    上記のように設定してみたのですが事象変わりませんでした

    キャンセル

回答 2

check解決した方法

0

根本的な解決にはなってないのですが、以下のような文字列結合ではなく辞書型としてアペンドしてみたらうまく日本語が字入りました。

value = req['test']
body = '{"test": "'+value+'"}'
↓
body["test"] = req['test']
json.dumps(body)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

-1

Teratermの設定>端末の文字コードがおかしくなってませんか?
UTF8にしてみたらどーでしょ

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/11 20:02

    ご回答有り難うございます

    terateamに設定はすでにUTF-8でした..

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る