1

jsonp を使用して、Web サーバーからアプリケーション (sencha に組み込まれている) にデータを要求しています。リクエストには「sokt」と呼ばれる動的パラメータがあります。パラメータにスウェーデン文字 (å、ä、ö) がある場合とない場合があります。

スウェーデン語の文字がない限り、サーバーは期待される結果を返します。例: http://mywebsite.se/jsonnew.php?sokt=test&_dc=1370095960312&page=1&start=0&limit=25&callback=Ext.data.JsonP.callback31

ただし、リクエストにスウェーデン語の文字が含まれている場合、サーバーは何も返しません。例:

http://mywebsite.se/jsonnew.php?sokt =enastående&_dc=1370096101366&page=1&start=0&limit=25&callback=Ext.data.JsonP.callback39

しかし、リクエスト enastående を enast%E5ende に手動で URL エンコードすると、期待どおりの結果が得られます。

要約すると、問題は、jsonp からの要求がクエリ文字列を URL エンコードせず、応答をフォーマットする php スクリプト (utf_8 ヘッダーを持つ) によって受け入れられない Unicode 文字列を送信することです。これが本当にこれが機能しない理由である場合、私にはわかりませんが、どうすればこれを解決できますか?

コードで編集:

これは私の要求です:

          Ext.getStore('storen').setProxy({ type: 'jsonp', url: 'http://mywebsite.se/synonymer/jsonnew.php?sokt=' + param}).load()

そして、これはphpスクリプトです:

 <?php

 header('Content-Type: text/javascript; charset=utf8');

 include("config.php");

 $dbh = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);


 $sokt = $_GET['sokt'];

 $stmt = $dbh->prepare("SELECT * FROM table WHERE w1 = :sokt"); 

 $stmt->bindParam(':sokt', $sokt);

 $stmt->execute();

 $output = array();

  while ( $row = $stmt->fetch() ) {


  $output[] = array("key" => utf8_encode($row['w2']));
  }

  $callback = $_REQUEST['callback'];

 // Create the output object.

 //start output
 if ($callback) {

 echo $callback . '(' . json_encode($output) . ');';
 } else {

 echo json_encode($output);
 }


 ?>
4

4 に答える 4

1

utf-8 を扱うときは、最初にすべてが utf-8 用に設定されていることを確認してください

  1. HTML
  2. PHP、ファイルストア (ファイルエンコーディング)
  3. ウェブサーバー
  4. データベース列 (照合)
  5. データベース接続 (クライアントとサーバー)

そうすれば、ほぼ完全に äöüß の問題を忘れることができます (ここにはスウェーデン語の文字はありません ;-) )。

そして明らかに、とにかく正しく動作しない utf8_en|decode 関数は必要ありません。これらの関数に対する php.net のコメントを参照してください。

私は最近 ISO-8859-1 から utf-8 に切り替えましたが、それは大変な作業でしたが、その後は「文字変換」が必要なくなりました。

したがって、これらの äöü を URL にエンコードしないままにしておくと、問題が発生する可能性があります。私はExtを知りませんが、jsonとしてextraParamsの適切なUTF-8エンコーディングを行うにはそれが必要だと思います!

やってみました

Ext.getStore('storen').setProxy({
    type: 'jsonp'
    ,url: 'http://mywebsite.se/synonymer/jsonnew.php'
    ,extraParams: {
        sokt: encodeURIComponent(params)
    }
}).load();
于 2013-06-01T15:49:42.667 に答える
1

プロキシの URL に値を添付しているsoktため、プロキシは何かを変更したいと考えています。したがって、これは自分で気にする必要があります。そのencodeURIComponent()のネイティブメソッドがあります

Ext.getStore('storen').setProxy({ type: 'jsonp', url: 'http://mywebsite.se/synonymer/jsonnew.php?sokt=' + encodeURIComponent(param)}).load()

他の誰かがすでにこれに回答しているのを見ることができますが、彼の回答を削除したため、これは仕事が欲しいと言ったので、ここにいくつかの追加情報があります:

これで、リクエストは次のようにエンコードされて送信されます

http://mywebsite.se/jsonnew.php?sokt=enast%C3%A5ende&_dc=1370096101366&page=1&start=0&limit=25&callback=Ext.data.JsonP.callback39

ブラウザの開発者ツールを使用して確認してください。その場合は、フロントエンドが正しく動作しているため、バックエンドを確認する必要があります。

パラメータがURLデコードされているかどうかを確認し、そうでない場合はデコードする必要があります

$sokt = urldecode($_GET['sokt']);

データベースが本当に正しい方法で保存されていることを確認する必要があります。したがって、PHPMyAdmin (MySQL)、ManagementStudio (MS SQL)、または任意のクエリ ツールなどのツールを使用して、データベースが正しく動作し、データが正しい形式で保存されているかどうかを確認してください。

これをすべて確認すると、エラーが発生するはずです

于 2013-06-02T06:22:49.713 に答える
0

extraParamsURL にハードコーディングする代わりに、プロキシのオプションを使用してみてください。

Ext.getStore('storen').setProxy({
    type: 'jsonp'
    ,url: 'http://mywebsite.se/synonymer/jsonnew.php'
    ,extraParams: {
        sokt: param
    }
}).load();

または、単純なメソッドのparamsオプションload():

Ext.getStore('storen').load({params: {sokt: param});
于 2013-06-01T15:16:02.403 に答える