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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

7512閲覧

PHP側で、全角の文字データを含んだJsonをデコードすると空文字になります

aiueoao

総合スコア146

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2016/10/13 13:00

###前提・実現したいこと

Unity3D(c#)にて、inputfieldでユーザ入力を受け取りJsonUtility.ToJsonでJSON 形式に変換後、それをサーバー(PHP)へ送りデコードしてデータベースに保存したいのですが、デコード時にユーザ入力全角文字(2バイト文字?)が空文字になります。全角文字が消えないようにするにはどうすればいいのでしょうか?

全角と半角英字の混合文だと半角英字のみ残ります (例: aあ [decode]→ a)

PHPのデコード部分に問題があると思い、いろいろと調べてみましたが解決に至りませんでした。
お力添えお願いいたします
###発生している問題・エラーメッセージ

デコード時にBOMを除く処理を入れないと json_last_error() で Control character error, possibly incorrectly encoded\r+ が出る状態です

###該当のソースコード

c#

1//Unity3D側 2using UnityEngine; 3using System.Collections; 4using System; 5 6public class DB_Test : MonoBehaviour { 7 8 public InputField inp; //ユーザ入力のためのinputfield 9 const string LOCALDOMAIN = "localhost"; 10 string m_url = "http://" + LOCALDOMAIN + "/phptest.php"; 11 12 //jsonにして phpへ渡すクラス 13 [Serializable] 14 class MyJsonClass 15 { 16 public string mydata; //ユーザ入力をここへいれる 17 } 18 19 //ボタンイベントで開始 20 public void OnButton() 21 { 22 try 23 { 24 WWWForm form = new WWWForm(); //データ送信準備 25 26 MyJsonClass gs = new MyJsonClass(); 27 gs.mydata= inp.text; //inputfieldの値を phpへ渡すクラスのメンバー変数に代入 28 29 string str = JsonUtility.ToJson(gs); //クラスをJson形式に変換 30 form.AddField("post", str); 31 WWW result = new WWW(m_url, form); // Web にシンプルにアクセスします 32 }catch(Exception e) 33 { 34 Debug.Log("error"+e.ToString()); 35 } 36 } 37}

php

1// サーバー側 2<?php 3 4// DB接続処理. 5require_once dirname(__FILE__) . '/db_Conf.php'; 6// 出力形式の設定 JSON形式で送信 7header( 'Content-type: application/json; charset=UTF-8' ); 8 9 10 //JSON文字列をデコード(復号)するユーザ定義関数 引数にJson文字列 11 function deco($js) 12 { 13 //BOMをとってデコード 14 $obj=json_decode(preg_replace('/[\x00-\x1F\x80-\xFF]/', '',$js),false); 15 16 if (json_last_error() === JSON_ERROR_NONE) { 17 return $obj; 18 }else { 19 exit; // エラーがあれば終了 20 } 21 } 22 23 $db = getDb(); //DBへの接続を確立 24 $jsondata=$_POST['post']; //簡単のために直接代入 25 $obj=deco($jsondata); //オブジェクト型でデコード 26 27 //----------DB登録---------- 28 $stt=$db->prepare('insert into u2 (mydata) values (:data)'); 29 $stt->bindvalue(':data',$obj->mydata); 30 $stt->execute(); //実行

###補足情報(言語/FW/ツール等のバージョンなど)
Unity3d 5.3.5f1 (64bit)
PHP 7.0.8
phpエディタ Visual Studio code (UTF-8)
db PostgreSQL

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

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

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

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

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

guest

回答2

0

ベストアンサー

preg_replace で文字列を置換する際には u 修飾子が必要かどうかを確認しましょう。
PCRE では u 修飾子がついていない場合はバイト単位、ついている場合は文字単位で処理されます。マッチを行う際にはほとんど問題になりませんが、置換の際には気をつけなれけばなりません。

lang

1<?php 2// u 修飾子なしの場合 3preg_replace('/[\x00-\x1F\x80-\xFF]/', '', 'あいうえお'); // => '' 4 5// u 修飾子ありの場合 6preg_replace('/[\x00-\x1F\x80-\xFF]/u', '', 'あいうえお'); // => 'あいうえお'

今回の処理の目的は BOM を削除することなのでバイト単位で処理してしまうと日本語の範囲の文字は消えてしまうため、u 修飾子をつける必要があります。

参考:
PHP: 正規表現パターンに使用可能な修飾子 - Manual

投稿2016/10/13 14:19

chitoku

総合スコア1610

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

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

aiueoao

2016/10/14 02:21

回答ありがとうございます。教えて頂いた通りにやったらできました! 正規表現パターンの修飾子は失念してました。
guest

0

まず関数が受け取った直後の $js、 正規表現を通した後の $js をデバッグ出力して内容を確認してはどうでしょうか?
見た感じ正規表現でBOMだけでなくASCII文字以外の全ての文字を削除してしまっている気がします。

Control character error, possibly incorrectly encoded\r+

このエラーは文字通り改行コードの問題ではないかと。

投稿2016/10/13 14:24

timy

総合スコア168

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

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

aiueoao

2016/10/14 02:27

回答ありがとうございます。 仰られる様な確認方法を思いつきませんでした。大変参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問