0

假设我将一个重音字符(例如 ASCII 233)键入如下形式:

在此处输入图像描述

然后我使用此代码发布。关键点,据我了解:URL 编码不适用于 ASCII > 127,因此您必须引入不同的内容类型。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" dir="ltr" lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <script type="text/javascript" src="../js/third_party/jquery.js"></script>
        <script>
            $(document).ready(function(){
                $('#but').click(function(){
                    var fd = new FormData();    
                    fd.append( 'params', $('#inp').val());
                    $.ajax({
                        url: 'http://my-server-address-here',
                        data: fd,
                        dataType: 'json',
                        processData: false,
                        contentType: false,
                        type: 'POST',
                        success: function(data){
                            alert(data);
                        }
                    });
                });
            });
        </script>
    </head>
    <input id="inp"></input>
    <button id="but">Submit</button>
</html>

问题是,Chrome 似乎仍然会破坏角色,如此处所示。这是在它甚至到达服务器端脚本之前,但是,从那里输出它会显示同样的问题。

在此处输入图像描述

我们一直输出这种类型的数据(例如服务器到浏览器),没有任何问题或特殊逻辑,所以,我认为必须有可能让我的“法语 e”出现在服务器端,而无需任何特殊的翻译或转换,其他而不是正确配置浏览器和请求,我认为我没有这样做。任何建议表示赞赏。

4

2 回答 2

0

这工作得很好,比你的代码简单一些

live demo

<!DOCTYPE html>
<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <script type="text/javascript" src="http://code.jquery.com/jquery-git.js"></script>
        <script>
            $(function() {
                $("#but").click(function(){
                    var $data = { "params":$("#inp").val()};
                    $.ajax({
                        url: "dump.php",
                        data: $data,
                        type: "POST",
                        success: function(data){
                            $("#result").html(data);
                        }
                    });
                });
            });
        </script>
    </head>
    <input id="inp" value="Français - Wikipédia"></input>
    <button id="but">Submit</button>
    <div id="result"></div>
</html>
于 2013-08-28T16:26:32.970 回答
0

我相信您的示例效果很好。您已经在标记中告诉浏览器将此页面视为 UTF-8 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">,这意味着它将以 UTF-8 提交表单数据。百分比编码在这里无关紧要,因为您将字符作为 http 正文的一部分(作为 multipart/form-data)发送。

您在 Chrome 的开发人员工具中看到的字符是开发工具将您的单字符 é 视为两个单字节字符而不是两字节 UTF-8 字符的结果。您的服务器应该正确地将两个字节作为单个字符读取,而不是像 chrome 开发工具那样读取两个字符。

(我刚刚使用 Node.js 服务器测试了您的示例,服务器将表单正文正确解释为 UTF-8,返回“é”作为输入。)

于 2013-08-28T16:17:36.243 回答