【问题标题】:Jsonp request with Swedish character gives null response带有瑞典字符的 Jsonp 请求给出空响应
【发布时间】:2013-05-28 05:55:53
【问题描述】:

我正在使用 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 url 编码为 enast%E5ende,我会得到预期的结果。

所以,总而言之,问题似乎是来自 jsonp 的请求没有对查询字符串进行 url 编码,它发送了格式化响应的 php 脚本不接受的 unicode 字符串(它有一个 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);
 }


 ?>

【问题讨论】:

  • 请提供您的一些代码。
  • 当然,我刚刚用请求和格式化和输出响应的服务器端 php 脚本更新了我的问题。
  • 我敢打赌 MySQL 请求会失败。如果你在分配之后var_dump($sokt);die;,你会得到什么?
  • 我得到:enast%C3%A5ende,我需要 enast%E5ende 才能使脚本工作。另一个线索是,如果我对查询 ($sokt) 进行 utf8_encode,则响应为空。

标签: ajax extjs jsonp


【解决方案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) 等工具或任何查询工具来查看您的数据库行为是否正确以及数据是否以正确的格式存储。

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

【讨论】:

  • 嘿,数据库确实有问题,虽然不清楚是什么。我最终创建了一个新数据库,然后它运行良好。不需要 urlencoding(或解码),但你给了我一些能量继续尝试,所以你会得到我的认可:)。谢谢
  • @user1009453 不客气;)很高兴它以某种方式帮助了你。
【解决方案2】:

在处理 utf-8 时,首先要确保一切都配置为 utf-8

  1. HTML
  2. PHP,文件存储(文件编码)
  3. 网络服务器
  4. 数据库列(排序规则)
  5. 数据库连接(客户端和服务器)

如果这样做,您几乎可以完全忘记 äöüß 的麻烦(这里没有瑞典字符 ;-))。

显然您不需要任何无论如何都无法正常工作的 utf8_en|decode 函数,请参阅 php.net 上的 cmets 了解这些函数。

我最近从 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();

【讨论】:

  • 感谢您的回复。我检查过,到处都是 utf8,但查询失败。
【解决方案3】:

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

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

或者,更简单的是load() 方法的params 选项:

Ext.getStore('storen').load({params: {sokt: param});

【讨论】:

  • 谢谢,但没有,仍然没有返回任何内容。像以前一样,在参数中不使用 å,ä,ö 时一切正常,但使用时它什么也没给我。
  • 那么也许你应该在发送之前使用encodeURIComponent手动编码你的参数......
  • 听起来不错,但它不起作用。我可以在服务器端解决这个问题吗?
  • 可能是因为在我自己的服务器上,一切都通过了——无论是否对其进行编码、在参数中、在 URL 中或在浏览器地址栏中进行硬编码...
  • 奇怪的是,它没有返回任何东西。由于编码错误,我预计会出现一些乱码(如“L�schen”而不是“Löschen”),但“nothing”表示与字符转换无关但由字符转换触发的问题。
【解决方案4】:

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

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

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

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

也许其中一种或两者的结合都可以。

【讨论】:

  • 不,还是同样的问题。不过我发现了另一件事。如果我将“enast%E5ende”作为参数,var_dump $sokt 我得到“enast�ende”,即浏览器不读取代码,但 mysql_query 有效!但是,如果我 utf8_encdode $sokt var_dump 给了我“enastående”,但他查询失败。我有 utf_8 排序规则和 utf_8 数据库连接。
猜你喜欢
  • 1970-01-01
  • 2012-04-24
  • 2011-11-05
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
相关资源
最近更新 更多