坚持使用Jquery Ajax Db编码为ISO-8859-9 Charset

时间:2012-07-24 22:44:05

标签: php jquery html ajax asp-classic

我正在尝试通过我的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代码。我必须使用İ作为İ。

感谢您的建议!

2 个答案:

答案 0 :(得分:2)

application/x-www-form-urlencoded没有字符集。它只是ASCII字符。指定charset将无能为力。

jQuery通常会将您的数据urlencode为is specified

  1. 编码为UTF-8
  2. 百分比编码
  3. 所以:

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