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

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

ただいまの
回答率

90.76%

  • PHP

    19158questions

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

  • JavaScript

    15246questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • jQuery

    6307questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

  • MySQL

    5502questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

[javascript][PHP] MySQLよりjsonで半角英数字を出力した際に、カンマが文字コードになってしまう。

解決済

回答 2

投稿 編集

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

xjaPANDA

score 106

下記のコードは、画面に表示された「I'm fine.」という文字列に対応するキーコードを変数listにある配列より取得し、文字列のはじめより、キーボートからの入力と一文字ずつ一致させて、一致した場合は、「*」に変換して、次の文字に進んでいくというものです。

表示する文字列「I'm fine.」は、var words = [{w:"I'm fine."}] のように変数wordsに定義しています。このようにjavascriptだけで書く場合は、問題なく実行できます。

一方で、問題なのは、変数wordsに、phpで表示したものを代入する場合です。
var words = <?php echo json_encode($word); ?>のように、jsonでMySQLより取得したデータを出力した場合です。この場合は、画面表示には、 「I'm fine.」と表示され一見問題なく見えますが、F12でコードを確認すると、変数wordsの部分は、var words = [{"w":"I&#039;m fine."}]; 出力され、文字列の「'」部分が文字コードの「&#039;」で出力されます。この場合、外部のキーボード入力は、「'」キーではなく「&」「#」「0」「3」「9」「;」のキーに反応するので、「'」キーだけで一致させるようにしたいと思います。

この場合どのような解決方法が考えられますでしょうか? 

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Test</title>
  <style> body { text-align: center; } #w {font-size: 35px; letter-spacing: 3px;}</style>
</head>
<body>

<p id="w"></p>

<script>
(function() {
'use strict';

var list =
[
{    key: '73', value: 'I', shift: true},
{    key: '55', value: '\'', shift: true},
{    key: '77', value: 'm', shift: false},
{    key: '32', value: ' ', shift: false},
{    key: '70', value: 'f', shift: false},
{    key: '73', value: 'i', shift: false},
{    key: '78', value: 'n', shift: false},
{    key: '69', value: 'e', shift: false},
{    key: '190', value: '.', shift: false},
{    key: '54', value: '&', shift: true},
{    key: '51', value: '#', shift: true},
{    key: '48', value: '0', shift: false},
{    key: '51', value: '3', shift: false},
{    key: '57', value: '9', shift: false},
{    key: '187', value: ';', shift: false}
]

//var words = [{w:"I'm fine."}];   //javascript こっちは正常に実行できます。
var words = [{"w":"I&#039;m fine."}];  //phpよりjsonで出力したもの カンマが文字コードになってしまうので、キーボードより入力した際に、不具合が生じます。


    var num = words.length;
    var currentWord;
    var currentLocation;
    var w = document.getElementById('w');
    var isStarted;
    var listLength = list.length;
    var listValue;
    var currentShift;
    var wordsShift;
    var shift;

//*Convert words[] to keyCode

    var words_key = [];
    var key_num = 0;

    for (var x = 0; x < words.length; x++) { 
      for (var y = 0; y < words[x].w.length; y ++){
        for (var j = 0; j < listLength; j++) {
          if(list[j].value == words[x].w[y]){
            words_key[key_num] = list[j].key;
            key_num++
          }
        }
      }
    }

//初期画面
    function init() {
      currentWord = 'Start';
      currentLocation = 0;
      w.innerHTML = currentWord;
      isStarted = false;
    }

    init();

//実行
    window.addEventListener('keyup', function() {
      if (!isStarted) {
        isStarted = true;
        currentWord = words[0].w;
        w.innerHTML = currentWord;
      }
    });

//判定
    window.addEventListener('keydown', function(e) {
      if (!isStarted) {
        return;
      }

      for (var j = 0; j < listLength; j++) {
          if(list[j].value == currentWord[currentLocation]){
          currentShift = list[j].shift;
         }
      }

      wordsShift=false;
      shift = e.shiftKey;

      for (var j = 0; j < listLength; j++) {
          if(list[j].key == e.keyCode && list[j].shift == shift){
          listValue = list[j].value;
          wordsShift=list[j].shift;
         }
      }

      if (listValue == currentWord[currentLocation]){
        currentLocation++;

      var placeholder = '';
      for (var i = 0; i < currentLocation; i++) {
        placeholder += '*';
      }

      w.innerHTML = placeholder + currentWord.substring(currentLocation);

    }
  });

})();
</script>


</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

MySQL内のデーターの「'」が既にHTMLエンコードされて格納されていることが原因かと思います。
仮に$wordがPHPフレームワークを使用してViewのHTMLエンコードがデフォルトになっている場合は別です。

試しに下記のようにすれば、「'」はエンコードされずにJson文字列が出力されると思います。

var words = <?php echo json_encode(["w" => "I'm file."]); ?>;

従って下記のように、$wordのPHP連想配列のHTMLエンコードをデコードしてから表示すればうまく出力されます。

var words = <?php
    array_walk_recursive($word, function(&$value, $key) {
        $value = html_entity_decode($value, ENT_QUOTES, 'UTF-8');
    });

    //日本語をユニコードエスケープしない
    echo json_encode($word, JSON_UNESCAPED_UNICODE);
?>;

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/12 23:08

    ありがとうございます。html_entity_decode()を使ったことがなかったので、とても勉強になりました。

    キャンセル

+1

こうでは。

var words = JSON.parse( '<?php echo json_encode($word); ?>' );

【JSON.parse() - JavaScript | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/12 23:05

    ありがとうございます。とても勉強になります。

    キャンセル

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

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

関連した質問

  • 解決済

    jQueryで絞り込みした<li>を生成

    あるいくつかの企画から「グループ」「場所」「ジャンル」で絞り込むコードを作成しようとしましたが、うまくいきませんでした。オブジェクトに格納されている値はconsole.log()使

  • 解決済

    Textarea内の文字に改行制限を設けたいのですが…。

    こんにちは、プログラミング初心者です。 現在Monaca(HTML+JavaScriptのハイブリッドアプリ開発プラットフォーム)の無料プランで初のアプリ開発に取り組んでいます。

  • 解決済

    jQueryでのテキストのHTML置換

    指定したテキストが入力されている時に置換するためのコードを下記のように書きました。 var list={"science":"科学","chemistry":"化学"}; $(

  • 解決済

    店ごとにカレンダーの休日の設定

    jQuery UI のお問い合わせフォーム欄に「カレンダー」を実装していますが… 実行したい内容 ・店(店舗A)を選択後、カレンダー通りに、選べるようにしたい。 ・店ごとの休日が異

  • 解決済

    ボタンをクリックして表示される文字列を条件分岐して表示させたい

    テキストボックスに数値を入力して、その値によって文字列を表示したいです。 しかし、どの値を入れても、最初の条件にマッチし、「軽すぎ」としか表示されません。 おまけに、formタグの

  • 解決済

    class直下 radioのvalueをすべて取得したい

     やりたいこと 現在、新規登録画面を作成しています submitが行われた時に,各科目radioボタンのvalue値を計算しようとしたところ input内のnameを毎回

  • 解決済

    chart.jsにて、円グラフで動的変更ができません。

    chart.jsとangular.jsを利用して、入力した数値を円グラフでアニメーションを利用し表示したいと思います。 線グラフについては実践されている方がおり、その方からソースを

  • 解決済

    ルーレットの作成方法について

    完全初心者です、、、 下記を満たすルーレットを作成しておりますが、上手くいかず壁にぶつかっております。 1.ルーレットの目を16個作成する 2.スタートボタンを押すとルーレット

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

  • PHP

    19158questions

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

  • JavaScript

    15246questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • jQuery

    6307questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

  • MySQL

    5502questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • トップ
  • PHPに関する質問
  • [javascript][PHP] MySQLよりjsonで半角英数字を出力した際に、カンマが文字コードになってしまう。