错误的字符编码

时间:2016-06-17 13:23:33

标签: php mysql mysqli character-encoding

我在两个不同的页面上有两个表单,用于将数据插入MySQL数据库。我在表单数据中有一些特殊字符,如'čšžćđ',我通过表单传递给插入脚本。

来自第一个表单的数据被正确插入,而第二个表单中的某些字段包含'?'字符,表示编码不匹配。

两个表单的两个插入脚本使用相同的文件连接到数据库并设置编码,如下所示:

<?php

$username = "root";
$password = "";
$servername = "localhost";

$conn = mysqli_connect($servername, $username, $password);
mysqli_select_db($conn, "testdb");

if (!$conn) {  // check if connected
    die("Connection failed: " . mysqli_connect_error());
    exit();
}else{

/* change character set to utf8 */
if (!mysqli_set_charset($conn, "utf8")) {
   // printf("Error loading character set utf8: %s\n", mysqli_error($conn));
} else {
   // printf("Current character set: %s\n", mysqli_character_set_name($conn));
}

mysqli_select_db($conn, "testdb");
//echo "Connected successfully.";


  // Check if the correct db is selected
  if ($result = mysqli_query($conn, "SELECT DATABASE()")) {
      $row = mysqli_fetch_row($result);
      //printf("\nDefault database is %s.\n", $row[0]);
      mysqli_free_result($result);
  }
}
?>

我想这意味着客户端字符编码设置不正确?所有数据库表都具有utf_8编码集。

2 个答案:

答案 0 :(得分:1)

尝试在页面顶部设置编码

<?php 

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

other code...

答案 1 :(得分:1)

您在谈论HTML表单吗?如果是的话,

<form accept-charset="UTF-8">

每个重音字符是一个?吗?当您尝试使用utf8 / utf8mb4时,如果您看到问号(常规问号,而不是黑色钻石),

  • 要存储的字节不编码为utf8。解决这个问题。
  • 数据库中的列为CHARACTER SET utf8(或utf8mb4)。解决这个问题。
  • 另外,检查读取期间的连接是否为utf8。

数据可能已转换为?,因此无法从文本中恢复。

SELECT col, HEX(col) FROM ...查看已存储的内容。

  • ?3F十六进制。
  • 重音欧洲字母每个字符有两个十六进制字节。这包括čšžćđ
  • 中的每一个
  • 中文,日文和韩文将(大多数)每个字符有三个十六进制字节。
  • 四个十六进制字符表示“双重编码”。