带瑞典语字符的Jsonp请求给出null响应

时间:2013-06-01 14:32:46

标签: ajax extjs jsonp

我正在使用jsonp从Web服务器向我的应用程序(内置的sencha)请求数据。该请求有一个名为'sokt'的动态参数。有时参数具有瑞典字符(å,ä,ö),有时则不具备。

只要没有瑞典语charachter,服务器就会返回预期的结果:例如: 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

但是如果我手动url将请求enastående编码为enast%E5ende,我会得到预期的结果。

因此,总而言之,问题似乎是来自jsonp的请求没有对搜索字符串进行url编码,它发送的是unicode字符串,该字符串不会被格式化响应的php脚本接受(具有utf_8-头)。如果这是因为这不起作用的原因,我不确定,我将如何解决这个问题?

编辑代码:

这是我的要求:

          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 个答案:

答案 0 :(得分:1)

在处理utf-8时,首先要确保所有内容都配置为utf-8

  1. HTML
  2. PHP,文件存储(文件编码)
  3. Web服务器
  4. 数据库列(整理)
  5. 数据库连接(客户端和服务器)
  6. 如果这样做的话,你几乎完全忘记了äöüß的麻烦(这里没有瑞典语字符;-))。

    显然你不需要任何无法正常工作的utf8_en | decode函数,请参阅php.net对这些函数的评论。

    我最近从ISO-8859-1切换到了utf-8,这是一个很糟糕的工作,但之后任何“char转换”都需要了。

    所以:将这些äöü留在未编码的URL中可能仍然会导致问题。我不知道Ext但是假设他们正在做一个正确的UTP-8编码的extraParams作为json需要!

    你试过吗

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

答案 1 :(得分:1)

您在代理的网址中附加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

使用浏览器开发人员工具验证。如果是这样,前端做了任何事情,你就必须检查后端

你必须检查param是否是URL解码,如果没有解码

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

并且您必须确保您的数据库确实存储所有正确的方式。因此,使用PHPMyAdmin(MySQL),ManagementStudio(MS SQL)或任何查询工具等工具来查看数据库的行为是否正确以及数据是否以正确的格式存储。

检查所有这些应该会导致错误

答案 2 :(得分:0)

尝试使用代理的extraParams选项,而不是在网址中对其进行硬编码:

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});

答案 3 :(得分:0)

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

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

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

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

也许这些中的一个或两者的组合都可以。