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

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

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

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

Q&A

解決済

2回答

2973閲覧

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

cray123

総合スコア47

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

0グッド

1クリップ

投稿2019/03/11 07:23

編集2019/03/11 07:28

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

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

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

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

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

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

quickquip

2019/03/11 08:41

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

2019/03/11 08:53

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

2019/03/11 11:37

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

2019/03/12 06:26

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

回答2

0

自己解決

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

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

投稿2019/03/12 06:30

編集2019/03/12 06:32
cray123

総合スコア47

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

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

0

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

投稿2019/03/11 10:02

y_waiwai

総合スコア87749

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

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

cray123

2019/03/11 11:02

ご回答有り難うございます terateamに設定はすでにUTF-8でした..
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問