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

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

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

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

Unicode

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

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

3回答

7008閲覧

AWS上でPythonコードにて日本語をReturnするとユニコードになる

TheGloryDay

総合スコア14

Python 3.x

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

Unicode

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

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2018/05/07 07:38

AWS上でLmbdaのPythonコード
にて日本語をReturnするものを実装し、API GatewayにてGetを定義し
URLをたたくとユニコードが返却されます。

def lambda_handler(event, context):
text= 'い'
text.encode('utf-8')
return(text)

上記がLambda
APIにてURLをたたくと
"\u3044"
ユニコードが返ってきます。

上記のようにencodeの処理をいれてもだめでした。

ご存知の方いたら教えてください。

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

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

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

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

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

guest

回答3

0

text.encode('utf-8')ではtext自身は変わりません。
return text.encode('utf-8') または text = text.encode('utf-8')としてください。

投稿2018/05/07 07:49

can110

総合スコア38262

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

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

TheGloryDay

2018/05/07 07:56

迅速な回答ありがとうございます! 両方の方法で試したところエラーとなります。元々はエラーはでません。 以下エラー内容 { "errorMessage": "b'\xe3\x81\x84' is not JSON serializable", "errorType": "TypeError", "stackTrace": [ [ "/var/lang/lib/python3.6/json/__init__.py", 238, "dumps", "**kw).encode(obj)" ], [ "/var/lang/lib/python3.6/json/encoder.py", 199, "encode", "chunks = self.iterencode(o, _one_shot=True)" ], [ "/var/lang/lib/python3.6/json/encoder.py", 257, "iterencode", "return _iterencode(o, 0)" ], [ "/var/runtime/awslambda/bootstrap.py", 110, "decimal_serializer", "raise TypeError(repr(o) + \" is not JSON serializable\")" ] ] }
can110

2018/05/07 08:13

なるほど。 AWS Lambda触ったことないので検討はずれの推測かもしれませんが おそらくハンドラ側ではそのままユニコード文字列として返してよく Responseデータは内部で適切にutf-8のjsonデータに変換されていると思われます。 ただ、API呼出元(受け側)でutf-8なjsonをよろしくユニコード文字列に変換していると思われます。 API呼出元で生のResponseデータが確認できればよいのですが。
hayataka2049

2018/05/07 08:25 編集

横槍ですが、ググってたらこんなのが出てきたので、 https://dev.classmethod.jp/cloud/aws/aws-lambda-api-gateway-ja/ もしAPI Gateway側でcharsetの設定を済ませていなかったらそれを設定して、python側でencodeなしとencode済みをそれぞれ試してみてください。どちらかは通るような気がします(当てずっぽう)
can110

2018/05/07 09:19

hayataka2049さん、情報ありがとうございます。 ハンドラ(実装)側で文字コード意識するのは面倒なので、設定側でよろしくやってもらいたいところです。
TheGloryDay

2018/05/07 09:29

can110さん、hayataka2049さんありがとうございます。 実はですねそちらのサイトも参照にしてたのですが、 APIGateway → リソース→ GET → 統合リクエスト の中にある 本文マッピングテンプレートで https://teratail.com/questions/115026 上記を参考に application/json;charset=UTF-8 としてみましたが状況はかわりませんでした。。 他の設定をする必要があるのでしょうか。。
TheGloryDay

2018/05/07 09:38

上記返信は関係なかったです。。すいません。 >もしAPI Gateway側でcharsetの設定を済ませていなかったらそれを設定して 設定場所ガ見つかりませんでした。。どこで設定できるかご存知でしょうか? 知識が足りなく申し訳ないです!
TheGloryDay

2018/05/07 09:51

hayataka2049さん ありがとうございます。 はい、ここの記事にのっていることはすでに済んでおります。 API-GatewayでGETを定義してテストボタンを押すと「い」と表示されるのに。 いざURLで呼び出しするとユニコードになって表示されてしまうのです。。。 Utf-8に設定するところがどこかにあるのかなあ?と探していたところです。。
can110

2018/05/07 09:56

AWS(Lambda)については無知なのでこれ以上適切な回答できずすみません。 >いざURLで呼び出しするとユニコードになって表示されてしまうのです。。。 とのことですが、この具体的な確認手順(ブラウザやPythonコードなど)を追記されると回答得られやすくなるかと思います。
TheGloryDay

2018/05/08 01:05

can110さん ありがとうございます。 1.PythonコードはAWS Lambdaで以下記述(細かい部分ははしょってます) def lambda_handler(event, context): text= 'い' return(text) 2.API GatewayのリソースにてこのLambdaをコールするように   GETにて定義 3.API Gatewayで「テスト」をすると   ”い”と表示される 4.デプロイ作業をしてステージのURLを取得 5.取得したURLをChromeブラウザにて   呼び出しを行うと"\u3044"と表示される 上記の手順にて3のテストで「い」となるのに ブラウザでURLを貼り付けてコールすると"\u3044" になってしまうとこでつまづいている状態です。
guest

0

自己解決

API Gateway側の設定 Lambda プロキシ統合の使用にチェックを入れることで日本語表示できるように
なりました。
回答いただいたかたがた、色々ありがとうございました。

投稿2018/05/17 00:30

TheGloryDay

総合スコア14

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

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

0

Pythonコードの先頭にエンコード設定いれてますか?

Ex.

python

1# --- coding: utf-8 --- 2from __future__ import print_function 3from botocore.client import ClientError 4from datetime import datetime 5 6import boto3 7import collections 8import time 9import os 10 11s3 = boto3.client('s3') 1213

投稿2018/05/09 01:23

lazhuward

総合スコア1294

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

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

TheGloryDay

2018/05/09 08:18

lazhuwardさん 回答ありがとうございます。 # --- coding: utf-8 --- 上記いれてみましたが、変わらずでした。。
lazhuward

2018/05/09 09:25

text= u'い' 単純にユニコードとして代入しても、同じでしょうか?
TheGloryDay

2018/05/09 09:51

lazhuwardさん はい、そちらもすでに試していたのですがだめだったです。 私自信もGoogleで調べきって、最終的にここにたどり着いている状態です。。 回答いただきありがとうございます!
lazhuward

2018/05/09 10:23 編集

サニタイジング(URLエン/デコ処理)は試していますか? http://blog.serverworks.co.jp/tech/2016/09/17/slack-apigateway-lambda-japanese/ 記事はSlackですが事象は同じかと思います。 つまりLambdaでURLエンコードしてAPIGatewayでURLデコード設定してみたらどうかということです。 URLエンコードにもキャラ設定がありますので注意してください。 あとChromeのエンコード設定も一度確認してみてください。IEだといけるとかないでしょうか。
TheGloryDay

2018/05/10 01:35

lazhuwardさん 元々IEでも試しましたが、だめでした。 Slackの記事どおりに設定してもうまくいかなかったのですが、、、 FireFoxで試しにやったところ、日本語が表示されました! しかも def lambda_handler(event, context): text = 'い' #text=text.encode('utf-8') return(text) 特にこざかしいことをやらずともいきました。 ChromeのURLエンコード設定ってなくなったとありましたが、最新バージョンでもあるんですかね。。
TheGloryDay

2018/05/10 01:38

追記ですが、、 URLをたたくとFireFoxのタブがでてきて JSONタブだと”い” 生データタブだと"\u3044" という具合でした
lazhuward

2018/05/10 05:24

なるほど。FFは生データをよろしく変換表示されているだけのようですね。 対してChromeはそのまま変換せずに生データを表示してるようです。 根本解決ではないかと思います。 結局、Lambda側でURLエンコードとかで、マルチバイトをシングルバイトにしないとうまくいかないような感じかと思います。
TheGloryDay

2018/05/10 06:18

lazhuwardさん おっしゃるとおりです、根本解決ではないです。 API Gateway側、Lambda側色々試しましたが、まだ解決には至れていません、、 またAPI Gatewayのテストではチャント表示されるのでここも謎です。 解決にいたれずなかなかはまっております。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問