我花了很多时间在网上搜索,看到了很多类似的答案,但找不到任何适合我的情况。
我花了一些时间将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
```
2条答案
按热度按时间ua4mk5z41#
ö
“mojibake”是什么意思ö
. 用utf-8字符查看“mojibake”故障;我看到的不是我储存的。但真正的问题可能发生在你从拉丁语转换过来的时候。
这些表需要通过
ALTER TABLE .. CONVERT TO CHARACTER SET utf8mb4
. 任何其他的技术都可能造成混乱。任何到mysql的连接都需要指定
utf8mb4
.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:
3)
最后;您需要确保php对结果数据所做的任何处理都是多字节感知的;通过使用
mbstring
一组函数。最值得注意的是:
mb_http_output()
-检测并转换http输出字符编码mb_internal_encoding()
-设置php的内部字符编码因此,在任何浏览器输出之前,每个php页面的顶部应该是这样的)
如果你对我做了什么
str_<whatever>
函数(和其他一些函数)您知道在字符串输出到浏览器(本例中是ajx)之前,它不会打断您的字符串。如果你不能使用
mbstring
任何原因的函数,请在此处查看如何安装它们.请同时回顾一下这个优秀的问答对你有什么帮助?
在这里可以找到关于解决mysql问题的更多阅读资料。