我正在尝试通过我的Jquery应用程序将数据传递给db。我的编码存在严重问题。
当前页面编码为iso-8859-9。我已经将我的ajax页面编码为iso-8859-9并使用contentType: "application/x-www-form-urlencoded;charset=ISO-8859-9"
传递.ajax数据
每次尝试都会将İZİN
值存储为Ä°ZÄ°N
。
如果我创建一个PHP页面并使用标题设置编码,它是否有效?
PS:我正在处理HTML页面上的数据。处理器页面是一个ASP页面,我猜想使用MsSQL db。我无权访问处理器页面或数据库。只需通过表格邮寄方式输入数据。
İZİN这个词和一些其他类似的词在WHERE子句的某些其他页面上用于sql查询。所以我无法将字符转换为HTML代码。我必须使用İ作为İ。
感谢您的建议!
答案 0 :(得分:2)
application/x-www-form-urlencoded
没有字符集。它只是ASCII字符。指定charset将无能为力。
jQuery通常会将您的数据urlencode为is specified:
所以:
$.post( "test.php", {data: 'İZİN'}); //Shorthand for $.ajax
实际上将此帖子发布到服务器:
data=%C4%B0Z%C4%B0N
当您使用php访问$_POST['data']
时,它们已被转换为字节(0xC4B05AC4B04E
),因此回显它们将为您提供格式错误的数据:
header("Content-Type: text/html; charset=ISO-8859-9");
echo $_POST['data'];
// Ä°ZÄ°N
您可以通过以下方式测试:
header("Content-Type: text/html; charset=ISO-8859-9");
echo "\xC4\xB0\x5A\xC4\xB0\x4E";
// Ä°ZÄ°N
在PHP中,您需要在收到后立即将其转换为ISO-8859-9:
<?php
header("Content-Type: text/html; charset=ISO-8859-9");
$data = "\xC4\xB0\x5A\xC4\xB0\x4E"; //$_POST['data'];
$proper = mb_convert_encoding( $data, "ISO-8859-9", "UTF-8" );
echo $proper;
//İZİN
请注意,在任何地方使用UTF-8都要容易得多,因为它几乎是最好的编码,网络喜欢它。如果你使用任何其他编码,那么你必须始终保持警惕。
答案 1 :(得分:0)
听起来问题是访问者页面不支持utf-8。
我对İZİN
及其乱码版本Ä°ZÄ°N
并不陌生。最有可能的原因是代码页。
来自 JQuery.ajax()
根据W3C XMLHTTPRequest标准,POST数据将始终使用UTF-8字符集传输到服务器。
因此,在您的ajax设置中,charset定义被忽略。
您需要访问您称为处理器页面的页面。它必须有utf-8代码页(65001)。
暂时在客户端,您可以在发送数据之前将UTF-8中编码的字母替换为具有预期单字节格式的两个字节。
function tr_map(data){
var tr_data = data;
var chrmap = {
"%C3%B6" : "%F6", //ö
"%C3%A7" : "%E7", //ç
"%C5%9F" : "%FE", //ş
"%C4%B1" : "%FD", //ı
"%C4%9F" : "%F0", //ğ
"%C3%BC" : "%FC", //ü
"%C3%96" : "%D6", //Ö
"%C3%87" : "%C7", //Ç
"%C5%9E" : "%DE", //Ş
"%C4%B0" : "%DD", //İ
"%C4%9E" : "%D0", //Ğ
"%C3%9C" : "%DC" //Ü
};
for (var chr in chrmap)
if(chrmap.hasOwnProperty(chr))
tr_data = tr_data.split(chr).join(chrmap[chr]);
return tr_data;
}
$.ajax({
url: "...",
type: "POST",
data: $("#myform").serialize(),
/*
other settings
success : ...
*/
beforeSend: function(x, s){s.data = tr_map(s.data);}
});