data是utf-8,ajax错误地返回了一些字符

tag5nh1u  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(397)

我花了很多时间在网上搜索,看到了很多类似的答案,但找不到任何适合我的情况。
我花了一些时间将mysql数据库从latin1(默认值)转换成utf-8。我清空了表(truncate),并从文本文件中重新导入了数据。我已经将我的页面的标题设置为使用utf-8的meta标记:

<meta http-equiv="Content-Type" content="text/html" charset="UTF-8" />

这在世界各地都被使用。当我通过php读取数据并将其输出到表单中时,数据会正确显示,文本如下:königstadt似乎是人们所希望的。保存它们(更新集…)看起来还可以,因为当我从数据中重新读取它们时,表单中的显示是正确的(php admin中的显示显示为“k”㶓尼格斯塔特”,这很奇怪,但当我读数据时,它似乎是正确的…-我希望这是一些奇怪的phpadmin)
当我使用ajax通过php检索数据时,所有事情似乎都落在我的ajax代码上。下面是一个相对简单的例程,它调用一个php程序来为select生成选项标记:

function get_branches()
     {
        // numeric values that need to be passed to the
        // routine (so we show the correct item selected)
        var region = document.getElementById("search_region").value;
        // the code in load_branches needs this, but ...
        var branch = document.getElementById("search_branch").value;

        $.ajax
        ({
           type: "POST",
           url: "<?php echo $Roster_html_RootPath; ?>lookups/load_branches.php",
           data: {
                   'region' : region,
                   'local_branch' : branch
                 },
           //cache: false,
           success: function(data)
           {
              // load contents of DIV tag with id of branchoptions:
              $("#branch_options").html(data);
           }  // end success
        }); // end ajax call
     }; // end function get_branches()

  }); // end document.ready ...

返回的大多数记录都是好的。但是上面所示的(königstadt)看起来像:kã¶在返回的html select中输入nigstadt。
我一直在尝试寻找解决方案,比如为ajax设置contenttype,以下是我尝试过的一些方法:

contentType: "application/x-www-form-urlencoded;charset=utf-8",

这一次似乎没有任何区别。什么都没变。

contentType: "application/text; charset=utf-8",

(或application/json)这会杀死传递到php文件的值——数据数组似乎没有到达那里,因为我从php中得到错误:

Notice: Undefined index: region in C:\xampp\htdocs\Heralds\Roster\lookups\load_branches.php on line 32

Notice: Undefined index: local_branch in C:\xampp\htdocs\Heralds\Roster\lookups\load_branches.php on line 33

我完全不知道如何正确返回值。我需要文本或html的版本(在这里我返回一个html表或option标记),但是我还需要对一些代码使用json数组来正确返回值。它们似乎都不能正确处理utf-8编码的数据。我已经为此工作了一段时间了,我非常沮丧。我看到的解释不起作用或在某些情况下没有意义。。。
PHP lookups/load_branches.php ```

ua4mk5z4

ua4mk5z41#

ö “mojibake”是什么意思 ö . 用utf-8字符查看“mojibake”故障;我看到的不是我储存的。
但真正的问题可能发生在你从拉丁语转换过来的时候。
这些表需要通过 ALTER TABLE .. CONVERT TO CHARACTER SET utf8mb4 . 任何其他的技术都可能造成混乱。
任何到mysql的连接都需要指定 utf8mb4 .

cqoc49vn

cqoc49vn2#

我的mysql数据库从latin1到utf-8(默认设置)。
1) 我用了“utf8\u unicode\u ci”。2) 我不知道你在说什么“多字节安全函数”。我在从$\u post读取数据时使用mysqli\u real\u escape\u string()和常用的mysqli\u query()等函数
这就是你问题的原因。
有三个主要的工作场所来纠正这一点:

1)

您需要在mysql中启用真正的utf-8(4字节),以便将存储在sql中的数据存储为正确的utf-8字符。通过将排序规则和字符集与 utf8mb4_ 前缀。

2)

为了确保应用程序/php中的数据正确保存,您需要通过在php中将连接字符集设置为full(4字节)utf-8来确保数据以utf-8 4字节字符的形式传递给mysql:

$mysqliObject->set_charset('utf8mb4');   // object oriented style
mysqli_set_charset($connect, 'utf8mb4');    // procedural code style

3)

最后;您需要确保php对结果数据所做的任何处理都是多字节感知的;通过使用 mbstring 一组函数。
最值得注意的是: mb_http_output() -检测并转换http输出字符编码 mb_internal_encoding() -设置php的内部字符编码
因此,在任何浏览器输出之前,每个php页面的顶部应该是这样的)

mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');

如果你对我做了什么 str_<whatever> 函数(和其他一些函数)您知道在字符串输出到浏览器(本例中是ajx)之前,它不会打断您的字符串。
如果你不能使用 mbstring 任何原因的函数,请在此处查看如何安装它们.
请同时回顾一下这个优秀的问答对你有什么帮助?
在这里可以找到关于解决mysql问题的更多阅读资料。

相关问题