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

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

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

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

PHP

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

Q&A

6回答

22779閲覧

JSON・PHPが文字化けもしくは何も表示されない

southern_flavor

総合スコア70

JSON

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

PHP

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

0グッド

0クリップ

投稿2017/06/05 02:39

編集2022/01/12 10:55

SJISのJSONをechoで書き出したとき、文字化けもしくは、何も表示されなくなってしまいます。
(現在のコードは何も表示されてない)

mb_convert_encodingの第二引数のところをUTF8にすると文字化けします。

これらを正常な状態で表示させる方法はありますか?
文字コードはSJISのままにしたいです。

追記:まずはSJISではなくても大丈夫です。
UTF-8でも同じように文字化けしてしまいます。

lang

1 2こちらはUTF-8でのコードになります。 3$jsonのみ出力です 4header('Content-type: application/json; charset=utf-8'); 5 6//エラー出力強制 7ini_set( 'display_errors', 1 ); // エラーを画面に表示(1を0にすると画面上にはエラーは出ない) 8//すべてのエラー表示 9error_reporting( E_ALL ); 10 11$url = 'test.json'; 12$json = file_get_contents($url); 13$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'); 14$arr = json_decode($json, true); 15 16if ($arr === null) { 17 return; 18} else { 19 echo ''.$json.''; 20}

lang

1header('Content-type: application/json; charset=utf-8'); 2 3$url = 'test.json'; 4$json = file_get_contents($url); 5$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'); 6$arr = json_decode($json, true); 7 8if ($arr === null) { 9 return; 10} else { 11 $json_count = count($arr['testjson']); 12 for ($i = $json_count - 2; $i < 2; $i++) { 13 echo '<p>'.$arr['testjson'][$i]['text'].'</p>'; 14 echo '<p>'.$arr['testjson'][$i]['url'].'</p>'; 15 echo ''.$json.''; 16 } 17}

lang

1{ 2 "testjson": [{ 3 "text": "ほじほじほじ", 4 "url": "hogehoge.hoge" 5 }, 6 { 7 "text": "ほじ", 8 "url": "hogehoge.hoge" 9 } 10 ] 11}

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

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

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

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

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

m.ts10806

2017/06/05 02:41

PHPファイル自体の文字コードは何になっていますか?
southern_flavor

2017/06/05 03:04

ご回答ありがとうございます。PHPはSJISになっています。
m.ts10806

2017/06/05 03:23 編集

「文字コードはSJISのままにしたい」理由も明記された方が良いかと思います。現在UTF8が主軸なはずなのであえてSJISを使うには何かしらの意図があるでしょうし。
southern_flavor

2017/06/05 03:48

失礼しました。システム全体がSJISで書かれているので、JSONだけUTF8で書くと変なところで影響が出るかなと思ってしまいました。
southern_flavor

2017/06/05 03:48

ですが、jsonはunicodeで書くものだと知りました。
guest

回答6

0

本題ではないのですが、「SJISのJSON」はJSONとは呼べません

JSON text SHALL be encoded in Unicode. The default encoding is UTF-8.

RFC 4627 Section 3)

ということで、SJISで書かれた「JSONのようなもの」は、受け取った側で処理できる保証がありませんので、素直にUTF-8などのUnicodeで出力して下さい。

投稿2017/06/05 02:50

maisumakun

総合スコア145121

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

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

southern_flavor

2017/06/05 03:06

ありがとうございます。JSONをUTF-8にして試しても結果は同じでした。。
guest

0

全てUTF-8とのことですが、バイトオーダーマーク(BOM)は確認されましたでしょうか?
BOMありUTF-8のファイルとBOMなしUTF-8のファイルが入り混じっていると文字化けするかと思います。
文字コード変換可能なエディタであればUTF-8とUTF-8Nが選択できるかと思います。(後者がBOMなしです)

投稿2017/06/05 06:11

Clor

総合スコア883

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

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

southern_flavor

2017/06/05 09:30

ありがとうございます。 BOMが原因ではないようでした。 回答いただいた方々の内容を参考に改めて修正後のコードをのせました。
guest

0

file_get_contents($url); で読み込んだ $json を、何もしないまま echo出力した結果はどうなっていますか?
そもそも test.json が正しく読めているのかどうかから切り分けていったほうが良いでしょう。

投稿2017/06/05 03:15

tacsheaven

総合スコア13703

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

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

southern_flavor

2017/06/05 03:46

ありがとうございます。 試しましたが、test.jsonは正常に読み込まれているようです。 mb_convert_encodingの書き方次第で、何も表示されなくなるのは変な話ですよね。。
guest

0

SJISのJSONという奇怪な代物ですね。

php

1header('Content-type: application/json; charset=shift_jis'); 2```という風に、**出力前に**出力をSJISで強制してやればいいと思いますが、 3そもそもブラウザなどでJSONをSJISで受け取ってくれるかどうかは謎です。 4なにせ misumakunさんが書いているように、JSONはUTF-8が求められるからです。 5 6追記 7--- 8おっと、勘違いです。 9`test.json`がSJIS何ですね。 10え?本当? 11 12`test.json`(SJIS)をjson_decodeしたい、ってことですよね?

$url = 'test.json';
$json = file_get_contents($url);
$json = mb_convert_encoding($json, 'UTF-8', 'CP932');
$arr = json_decode($json, true);

投稿2017/06/05 03:09

編集2017/06/05 03:15
shi_ue

総合スコア4437

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

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

southern_flavor

2017/06/05 03:44

ありがとうござます。JSONについては大変な間違いをしていたようでお恥ずかしい限りです。 ご提示いただいた内容を試したのですが、だめでした。 SJISはもうやめて全部UTF-8にしても結果は同じでした。。
guest

0

mb_convert_encoding()のto_encodingがUTF8ですが、UTF-8の打ち間違いですかね?

php

1$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'); 23$json = mb_convert_encoding($json, 'UTF-8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');

投稿2017/06/06 09:01

s-washion

総合スコア204

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

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

southern_flavor

2017/06/08 03:36

ありがとうございます。 実はこれも試しましたが、同じような感じでした。
s-washion

2017/06/08 05:56

関係なかったですか。 うーん、php.iniのmbstring設定を見直すか (参考サイト:http://cly7796.net/wp/php/correspondence-in-the-case-of-php-are-garbled-in-xampp/) test.jsonに複数の文字コードが混在していないか確認してみてください。 (テキストエディタなどで一度test.jsonを全コピーして、新しいファイルにペーストしそれを読み込ませてみてください)
guest

0

何も表示されなくなってしまいます。

PHPのエラー文が出ていない設定になっているのではないでしょうか。出すように設定してください。

PHP

1<?php 2//エラー出力強制 3ini_set( 'display_errors', 1 ); // エラーを画面に表示(1を0にすると画面上にはエラーは出ない) 4//すべてのエラー表示 5error_reporting( E_ALL );

【PHPのエラーメッセージを出力する | mawatari.jp】
http://mawatari.jp/archives/how-to-display-php-errors


追記:

UTF-8(BOM無し)で、下記のように書いたらとりあえず出力されると思うのですが、試してみてください。
(6/8追記)PHPファイルをUTF-8にして、下記のようにしても文字化けしますか?

PHP

1<!DOCTYPE html><html lang="ja"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"></head> 2<body><?php 3$j = '{"testjson": [{"text": "ほじほじほじ","url": "hogehoge.hoge"},{"text": "ほじ","url": "hogehoge.hoge"}]}'; 4$arr = json_decode($j, true); 5 6if ($arr === null) { 7 return; 8} else { 9 $json_count = count($arr['testjson']); 10 for ($i = $json_count - 2; $i < 2; $i++) { 11 echo '<p>'.$arr['testjson'][$i]['text'].'</p>'; 12 echo '<p>'.$arr['testjson'][$i]['url'].'</p>'; 13 } 14} ?> 15</body> 16</html>

投稿2017/06/05 03:11

編集2017/06/08 06:34
kei344

総合スコア69364

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

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

southern_flavor

2017/06/05 03:45

ありがとうございます。 こちらも試しましたが、エラーの内容は表示されないですね・・ 文字コードを全てUTF-8にしたらエラーは出ませんが、文字化けします。
kei344

2017/06/05 05:38

$json = file_get_contents($url);の時点で出力してみて、思った内容が含まれているか確認してみてください。
southern_flavor

2017/06/05 09:28

試してみましたが、内容は表示されるようです。 ただ、今度はHTMLタグが無効に・・。 修正後のコードをのせてみます。
kei344

2017/06/05 10:03

> 今度はHTMLタグが無効に・・。 内容確認をしたいだけなので、そうなります。 ブラウザの「ソースを見る」からその出力結果部分をコピーし、質問文に追記していただけませんか? それとも提示されているJSONと全く変わりないものが出力されていますか?
southern_flavor

2017/06/06 06:00

出力結果はJSONの内容と全く同じものがでました。 ソースは質問文に追加したのでご確認いただけたらと思います。
southern_flavor

2017/06/08 03:39

ソースをご提示いただいて、ありがとうございます。 しかし、私の環境ではUTF-8であっても日本語は文字化けしてしまうようです。 XAMPPを使ってるのですが、php.iniの設定は特に変えてないはずなのですが・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問