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,我会得到预期的结果。

所以,总而言之,问题似乎是来自 jsonp 的请求没有对查询字符串进行 url 编码,它发送了格式化响应的 php 脚本不接受的 unicode 字符串(它有一个 utf_8-header)。如果这确实是它不起作用的原因,我不确定,我将如何解决这个问题?

编辑代码:

这是我的要求:

          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,但假设他们将 extraParams 作为 json 进行正确的 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

sokt在代理的 url 中附加 的值,因此代理想要更改任何内容。所以你必须自己关心这个。该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

尝试使用extraParams代理选项而不是在 URL 中硬编码:

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 回答
0

尝试在服务器端解码您的参数:

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

在执行查询之前尝试强制您的数据库连接到 UTF8:

$dbh->prepare("SET NAMES 'utf8'")->execute();

也许其中之一或两者的结合将起作用。

于 2013-06-01T16:27:58.013 回答