【问题标题】:Accents printed differently every time, in PHP and HTML每次打印的口音都不同,在 PHP 和 HTML 中
【发布时间】:2015-03-01 18:06:31
【问题描述】:

我在我的页面中回显了一些带重音的单词,有时会这样打印:

acatl��n de ju��rez

在再次刷新页面几次后,它会像这样打印它们:

acatlán de juárez

这个过程来回重复。这不应该在我的应用程序中发生,因为我正在用这个词比较很多东西。

我的标题上已经有 utf-8

<meta charset="UTF-8">

使用的数据库排序规则:utf8_unicode_ci

导致此错误的变量分配如下:

$theString = "acatlan de juarez";

$a = array(
    'animal' => array('acatlán de juárez','hów','áre'),
    'color'  => array('yóu','good','thanks')
);
$b = array(
    'animal' => array('acatlan de juarez','how','are'),
    'color'  => array('you','good','thanks')
);
$theString = str_replace($b['animal'], $a['animal'], $theString);

// $theString now is $theString = "Acatlán de Juárez"

所以$theString 变量,在回显或执行查询时,有时会打印“acatl��n de ju��rez”,有时会打印“acatlán de juárez”。


编辑

我开始收到很多关于数据库查询的答案,它实际上与数据库无关,口音是从数据库中正确输出的。问题在于上面代码中解释的变量 $theString,它没有像应有的那样打印,带有重音符号。


编辑 2

我不知道现在发生了什么,我真的很困惑,在这个例子中:

$a = array(
'animal' => array('acatlán de juárez','hów','áre'),
'color'  => array('yóu','good','thanks')
);
echo $a['animal'][0];

我的代码完美地输出了“acatlán de juárez”这个词。

但是我有我的数组 $cities(和我的数组 $a 完全一样),但是有州和城市。像这样:

$cities = array(
'state1' => array('acatlán de juárez','city1','city2'),
'state2'  => array('city1','city2','city3')
);
echo $cities['state1'][0];

现在“acatlán de juárez”变成了“acatl��n de ju��rez”....为什么?!?


编辑 3

问题解决了,又是一个函数对字符集格式的问题,谢谢大家。

【问题讨论】:

  • 您使用的是什么数据库,如果有的话?这是 PHP 还是 HTML 输出?我们能看到产生这个的代码吗?您的文件使用什么编码?
  • @halfer 我将重音词分配给变量,例如 $words = "Acatlán de Juárez";然后我将此变量发送到我的 HTML 文档并执行echo $words;。然后我在上面解释的描述中得到结果,谢谢编辑:顺便说一句,我正在使用 MySQL
  • @halfer 另外,在将其发送到我的 HTML 文档之前,我会查询当我得到“acatl��n de ju��rez”时它在我的数据库中找不到结果,但是有时它会在“acatlán de juárez”时出现……这对我来说现在是一个大问题。谢谢
  • 您在数据库中使用什么排序规则?它在 phpMyAdmin 或 unicode MySQL 控制台中是否总是正确的?您使用什么操作系统? (历史上 Windows 没有一个好的控制台,所以如果你在这个操作系统上,请使用 phpMyAdmin 或 MySQL Workbench)。
  • 再次重复我的问题(这些问题需要编辑):1. 我们可以看到产生此问题的代码吗?2. 您的文件使用什么编码? (这是您的 IDE 或编辑器中的设置,例如 NetBeans)。

标签: php html utf-8


【解决方案1】:

几周前我遇到了和你完全相同的问题,在修改数据库 COLLATE 和 CHARSET 以及我如何处理 MySQL 查询后解决了这个问题。 My post is here.

  1. 将数据库的“默认集合”设置为utf8mb4 - utf8mb4_unicode_ci
  2. 确保表字段的“COLLATE”属性也设置为utf8mb4_unicode_ci
  3. 在您的 HTML 中将“元”标记设置为 &lt;meta charset="utf-8"&gt;
  4. 当您在 MySQL 上执行 SELECT、INSERT、UPDATE 时,请致电 $mysqli-&gt;set_charset('utf8mb4');

注意:我建议您阅读为什么 utf8mb4 或为什么不 utf8。另请阅读this

示例表

CREATE TABLE `quote` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `code` char(4) COLLATE utf8mb4_unicode_ci NOT NULL',
  `quote` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

示例选择

注意:关注set_charset()

$mysqli->set_charset('utf8mb4');
$result = $mysqli->query('SELECT * FROM quote');
while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
   //Do something with $row
}

插入/更新示例

$mysqli->set_charset('utf8mb4');
$sql = "INSERT INTO quote (code, quote) VALUES (?, ?)";
//$sql = "UPDATE ......";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ss', $_POST['code'], $_POST['quote']);
if (! $stmt->execute()) {
    echo $stmt->error;
}
echo 'Nice one';

【讨论】:

  • 非常感谢您的回答,但这不是我的问题,我什至在执行查询之前打印了结果,但我仍然得到 iconrrect 重音符号,请参阅我描述中的最后一个 sn-p,如果我回显 $theString 我会得到 "acatl��n de ju��rez" 但如果我回显 "acatlán de juárez" 我会得到预期的结果。将数组转换为另一个时会发生一切
  • 试过accept-charset="ISO-8859-1" in meta instead of utf8 or mb_internal_encoding("utf-8");或utf8_decode()iconv() 等等。在你的 php 代码中?试试看会发生什么。
【解决方案2】:

这是一个字符集错误。

这是一个简单的模型:

<?php
header('Content-Type: text/html; charset=utf-8');

$theString = "acatlan de juarez";

$a = array(
    'animal' => array('acatlán de juárez','hów','áre'),
    'color'  => array('yóu','good','thanks')
);
$b = array(
    'animal' => array('acatlan de juarez','how','are'),
    'color'  => array('you','good','thanks')
);
$theString = str_replace($b['animal'], $a['animal'], $theString);
?>
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
    <?php echo $theString; ?>
</body>
</html>

Run the Example

如果您使用的是 MySQL 或 MySQLi,则对于 DB:

//MYSQL
mysql_connect('host','usuer','pass');
mysql_select_db('database');
mysql_query("SET NAMES 'utf8'");
mysql_query('SET character_set_connection=utf8');
mysql_query('SET character_set_client=utf8');
mysql_query('SET character_set_results=utf8');

//MYSQLi
$mysqli = new mysqli('host', 'user', 'pass', 'database');
$mysqli->set_charset("utf8");

你必须配置你的数据库才能使用:utf8_unicode_ci

【讨论】:

  • 非常感谢您的回答,但这不是我的问题,我什至在执行查询之前打印了结果,但我仍然得到 iconrrect 重音符号,请参阅我描述中的最后一个 sn-p,如果我回显 $theString 我会得到 "acatl��n de ju��rez" 但如果我回显“Acatlán de Juárez”我会得到预期的结果。将数组转换为另一个时会发生一切
  • 我已经用你的例子更新了代码。它的工作。总是打印出来:acatlán de juárez
  • 非常感谢,我真的很抱歉你 100% 是正确的,但这并不能解决我的问题,请查看我的描述中的“EDIT 2”。我真的很困惑:(
【解决方案3】:

这个话题已经解决了。还有另一个函数导致字符串松散字符集格式。我无法删除此线程,但感谢大家的帮助。你一直都是对的。

【讨论】:

  • 一般来说,我们不允许人们在此处删除问题,因为解决方案将来可能对其他人有用。出于同样的原因,您能否详细介绍一下“字符集格式”是如何丢失的?
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2018-09-24
  • 2022-01-18
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
相关资源
最近更新 更多