每次都以不同的方式打印口音,使用PHP和HTML

时间:2015-03-01 18:06:32

标签: php html utf-8

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

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 ndeju rez”,有时会打印“acatlándejuá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ándejuárez”这个词。

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

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

现在“acatlándejuárez”变成了“acatl ndeju rez”......为什么?!?


编辑3

问题解决了,这是charset格式的另一个功能,谢谢大家。

3 个答案:

答案 0 :(得分:2)

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

  1. 将数据库的“默认集合”设置为utf8mb4 - utf8mb4_unicode_ci
  2. 确保表字段的“COLLATE”属性也设置为utf8mb4_unicode_ci
  3. 在HTML中将“meta”标记设置为<meta charset="utf-8">
  4. 当您在MySQL上执行SELECT,INSERT,UPDATE时,请致电$mysqli->set_charset('utf8mb4');
  5. 注意:我建议您阅读为什么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
    }
    

    示例INSERT / UPDATE

    $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';
    

答案 1 :(得分:1)

它是一个字符集错误。

这是一个简单的模型:

<?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:

//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

答案 2 :(得分:0)

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