几天后,我一直在寻找一种能在我身上显示UTF8的解决方案 网页。 目前造成问题的字符是į(unicode:\ u012f decimal:303)但是, 我的数据库中有超过10,000条记录,我不能保证所有其他记录都正确显示。 所以我正在寻找一个涵盖所有角色的解决方案。
į显示为?在HTML中。
我的设置是一个HTML页面,它使用AJAX向PHP文件发送请求。 PHP然后查询MYSQL数据库以查找特定条目, 然后它从该条目中获取立陶宛语单词并将其作为对AJAX的响应。 回到Javascript,响应被设置为HTML元素的innerHTML。 此当前设置不使用JQuery。
以下是我尝试解决问题的进展。
首先,我确认我使用的所有文件都已正确编码为UTF8,而不是UTF8BOM。
然后我在phpMyAdmin中打开MYSQL数据库来查看条目。 看到字符被替换?在条目中,我做了一些研究,发现数据库有错误的整理。 将数据库/表的排序更改为utf8_general_ci之后没有任何更改,因此我进一步调查并发现为表的各列更改它是另一种解决方案。 这工作正常,我的数据库现在正确显示字符。
接下来,我的网页中不会显示字符š(unicode:\ u0161十进制:353), 我使用PHP中的以下代码修复了这个问题,我在stackoverflow上找到了它。
function encode_string($string){
$encoded = "";
for ($n=0;$n<strlen($string);$n++){
$check = htmlentities($string[$n],ENT_QUOTES);
$string[$n] == $check ? $encoded .= "&#".ord($string[$n]).";" : $encoded .= $check;
}
return $encoded;
}
我不能说我完全理解这段代码但它导致角色š在到达我的HTML时正确显示。 然而,这对角色į不起作用。
我还尝试$conn->set_charset('utf8');
设置连接以使用utf8但是这会导致显示į
相反,$conn->query("SET NAMES UTF8;");
我发现将hard硬编码到Javascript或PHP中,允许它被发回并正确显示,例如echo "į";
有效。
所以我认为这个问题可能与回声之前的数据库或PHP有关。
但是,我没有识别问题的知识。
以下是我的php代码:
<?php
header('Content-Type: text/html charset=utf-8');
//Connection to database is made. Referred to as $conn
$sql = "SELECT * FROM Words";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
//Loop through the results to find a word with the status of 1
while($row = $result->fetch_assoc()) {
$status = $row["status"];
if($status == 1){
//respond to AJAX with the word
$ltword = trim($row["lt"]);
echo utf8_encode(encode_string($ltword));
//Has also been tested as
//echo encode_string($ltword);
//with no noticeable difference.
break;
}
}
}
function encode_string($string){
$encoded = "";
for ($n=0;$n<strlen($string);$n++){
$check = htmlentities($string[$n],ENT_QUOTES);
$string[$n] == $check ? $encoded .= "&#".ord($string[$n]).";" : $encoded .= $check;
}
return $encoded;
}
?>
核心问题是,鉴于我目前的设置, 如何从我的数据库中正确获取编码的UTF8字符以显示在我的网页上?
编辑:
php的mb_check_encoding()
函数验证从数据库接收的数据是否有效。
php.ini正在使用utf8作为它的默认字符集。
使用$conn->character_set_name();
返回结果latin1。
使用$conn->set_charset("utf8");
会导致它返回utf8,但是然后į显示为į仍然不正确。
答案 0 :(得分:0)
在你的情况下问题是整理,后来修改了。作为一种好的做法,尝试设置表格排序以及列排序相同即。 utf8_unicode_ci(一般来说速度更快,但unicode对于排序/显示更好)。
现在回到问题,问题在于已添加的数据由于不正确的整理而存储错误。为此你需要看&amp;解决方法,因为你不能确定它是否正确存储。
答案 1 :(得分:0)
如果你正在使用mysqli,你可以调用set_charset():
$mysqli->set_charset('utf8mb4'); // object oriented style
mysqli_set_charset($link, 'utf8mb4'); // procedural style
答案 2 :(得分:0)
如果您有端到端的UTF8(db&gt;连接&gt; php),则不必回显utf8_encode。只需回显变量即可正确显示。
最有可能的是,该字符在数据库中混乱,因为它仍然是原始编码。尝试使用本机UTF8字符更新数据库的内容,因为已经修复了排序规则并且它应该可以正常工作。
所以最喜欢你也需要$ conn-&gt; set_charset('utf8')。