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

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

ただいまの
回答率

90.49%

  • C#

    7136questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    4017questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • API

    1527questions

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

  • JSON

    1158questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • AWS Lambda

    53questions

AWS Lambda、API GatewayとunityでJSON形式が文字化けする。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 261

monomac

score 10

AWS LambdaとAPI Gatewayを使って日本語をJSON形式で返そうとしています。
Lambda関数実行時は日本語は正しく出力されているのですが、unityのコンソール上で日本語の部分が文字化けしてしまいます。

※数字など日本語以外は正しく表示されています。
   
  
コードは以下の通りです。
AWSではPython3.6を使い、unity上ではC#のスクリプトを使用しています。

AWS Lambda関数のコード 

import json
import re

print('Loading function')

def user_word():
    return "こんにちは"

def lambda_handler(event, context):

    tim="20180622_1912_58"
    m = re.match('(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})_(\d{2})$',tim)
    if m:
        print (m.group(1, 2, 3, 4, 5, 6))
    else:
        print [-1] * 6
    year=m.group(1)
    month=m.group(2)
    day=m.group(3)
    hour=m.group(4)
    minute=m.group(5)
    second=m.group(6)
    print (year,month,day,hour,minute,second)
    text = user_word()
    print (hour)
    hour2= hour
    if text=="おはよう" and hour2>4 and hour2 <11:
        print(event['word1'])  
        return event['word1'],'#挨拶',hour2
    elif text=="こんにちは":
        #print(event['word2'])  
        data = {
           "word1": event['word2'],
            "tag":"#認識",
            "hour":hour
        }
        return data
    else text=="こんばんは":
        print(event['word3'])
        return event['word3'],'#挨拶',hour


 
unity上でアタッチされているスクリプトのコード

using System.Collections.Generic;
using UnityEngine;
using System; 
[Serializable]
public class Info
{

    public string word1;
    public string word2;
    public string word3;

}



public class test1 : MonoBehaviour {

    string test1_url = "APIのURL";

    string API_Key = "APIKey";

    void Start()
    {
        StartCoroutine(getApiLog());
    }


    IEnumerator getApiLog()
    {
        Dictionary<string, string> headers = new Dictionary<string, string>();
        headers.Add("Content-Type", "application/json;charset=UTF-8");

        headers.Add("x-api-key", "APIKey");


        var data = new Info();
        data.word1= "おはよう";
        data.word2 = "こんにちは";
        data.word3 = "こんばんは";

        var json = JsonUtility.ToJson(data);
        Debug.Log(json);
        byte[] bytedata = System.Text.Encoding.UTF8.GetBytes(json);

        test1_url = test1_url;

        WWW www = new WWW(test1_url, bytedata, headers);
        yield return www;
        Debug.Log(www.text);
    }
}

補足 API Gatewayのレスポンス設定は以下の通りに設定してあります。

イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mather

    2018/06/29 00:22

    まず、Unityで受信する前に、API Gatewayがどんなレスポンスを返しているか確認しましょう。見た感じレスポンスモデルがEmptyなのでJSONを返していない気がしますが…。

    キャンセル

  • monomac

    2018/06/30 11:04

    matherさん。返答ありがとうございます。レスポンスモデルのモデルの枠は選択式になっていて、EmptyかError かを選ぶ形式になっています。

    キャンセル

  • mather

    2018/06/30 14:24

    それは知っているのですが、Emptyはモデルで何も規定しないということなので return event['word1'],'#挨拶',hour2 のようなコードで返している値はJSONではないという点が気になっています。というのとは関係なく、API Gatewayがどんなレスポンス値になっているかチェックしないと、どの時点で文字化けしているかという問題の切り分けができないので、それをまず調べてはいかがでしょうか。

    キャンセル

回答 1

check解決した方法

0

自己解決いたしました。
jsonでは文字をunicodeで扱っておりその中の¥文字がエスケープされているためにおこる現象みたいです。

C#で用意されているSystem.Text.RegularExpressionsメソッドを使用したところ
無事日本語で出力されました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • C#

    7136questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    4017questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • API

    1527questions

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

  • JSON

    1158questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • AWS Lambda

    53questions