我正在开发一个无法修改PHP代码的项目。我只能在编写JavaScript时修改JavaScript。
我将包含UTF-8字符的十六进制编码数据发布到PHP脚本。当PHP脚本尝试将数据解码为JSON时。 decode函数返回null并获得以下错误“格式错误的UTF-8字符,可能编码错误”。
十六进制解码似乎修改了编码,例如法语句子
L'équitationenFrance estletroisièmeporten nombre delicenciés
将转换为:
L \x18équitationenFrance estletroisièmeporten nombre delicenciés
阿拉伯语句子或使用非拉丁字符的任何语言都会变得更糟,因为它不再可读。
我可以在Javascript部分做任何事情来解决问题。在将它们转换为HEX之前,可能会进行某种转换以保留句子吗?
他是一个简单的代码演示问题:
PHP代码:
if(!empty($_POST)){
print_r($_POST);
$data = Hex2String($_POST["data"]);
$result = json_decode($data, true);
$errors = json_last_error();
echo "Errpr: {$errors}<br />";
var_dump($result);
exit();
}
function Hex2String($hex){
$string='';
for ($i=0; $i < strlen($hex)-1; $i+=2){
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
JavaScript代码
/***
* Converts a string into a hex representation of the string.
* @param {string} string
* @returns {String}
*/
function Str2Hex (tmp){
var str = "";
for (var i=0; i<tmp.length; i++)
str += ("00" + (tmp.charCodeAt(i)).toString(16)).substr(-2);
return (str);
}
$(function(){
var data = {
frenchText: "L‘équitation en France est le troisième sport en nombre de licenciés",
germanText: "Das für sein karolingisches in Höxter",
arabicText: "جانب من آثار مدينة جدارا اليونانيَّة"
};
$.post("index.php?DBGSESSID=1", {data:Str2Hex(JSON.stringify(data))},function(data) {
console.log($("#result"));
console.log(data);
$("#result").html(data);
});
});
完整示例:
<?php
if(!empty($_POST)){
print_r($_POST);
$data = Hex2String($_POST["data"]);
$result = json_decode($data, true);
$errors = json_last_error();
echo "Errpr: {$errors}<br />";
var_dump($result);
exit();
}
function Hex2String($hex){
$string='';
for ($i=0; $i < strlen($hex)-1; $i+=2){
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>index</title>
<link rel="stylesheet" href="/css/master.css" type="text/css" media="screen" title="no title" charset="utf-8" />
<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script>
</head>
<body>
<div id="result">
</div>
<script type="text/javascript">
/***
* Converts a string into a hex representation of the string.
* @param {string} string
* @returns {String}
*/
function Str2Hex (tmp){
var str = "";
for (var i=0; i<tmp.length; i++)
str += ("00" + (tmp.charCodeAt(i)).toString(16)).substr(-2);
return (str);
}
$(function(){
var data = {
frenchText: "L‘équitation en France est le troisième sport en nombre de licenciés",
germanText: "Das für sein karolingisches in Höxter",
arabicText: "جانب من آثار مدينة جدارا اليونانيَّة"
};
$.post("index.php?DBGSESSID=1", {data:Str2Hex(JSON.stringify(data))},function(data) {
console.log($("#result"));
console.log(data);
$("#result").html(data);
});
});
</script>
</body>
</html>
答案 0 :(得分:0)
找到解决方案:
function forceUnicodeEncoding(string) {
return unescape(encodeURIComponent(string));
}
data.frenchText = forceUnicodeEncoding(data.frenchText);
data.germanText = forceUnicodeEncoding(data.germanText);
data.arabicText = forceUnicodeEncoding(data.arabicText);
唯一的问题是在JavaScript 1.5版中不推荐使用unescape函数。
来源: http://andre.arko.net/2012/09/18/force-encoding-in-javascript/