【问题标题】:chinese simplified characters appears as question mark diamond [duplicate]简体中文显示为问号菱形[重复]
【发布时间】:2017-01-04 14:16:59
【问题描述】:

我已经设置了 meta 并检查 mysql 似乎已经在 utf 8 上,这似乎是什么问题?

HTML

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

PHP 数据库连接

$DB_NAME = 'ssl';
$DB_HOST = 'localhost';
$DB_USER = 'dbuser';
$DB_PASS = 'dbpass';

$mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);


// $mysqli->character_set_name();
mysqli_set_charset($mysqli,"utf8");


if (mysqli_connect_errno())
{
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

查询输出

$query = $mysqli->query("select {$translate_to} as lang from locale_cn where {$translate_from} = '$phrase' ");
        $row = mysqli_fetch_array($query);

显示

<h1><?php echo translate("In-Kind Donation"); ?></h1>

也试过设置 header('Content-Type: text/html; charset=UTF-8') 但结果还是一样

编辑:添加翻译功能信息

 function translate($phrase) {

    if(!isset($_SESSION)) 
    { 
        session_start(); 
    }

    require 'db/mysql.php';

        $_GET['lang'] = $_SESSION['lang'];
        $lang_session = $_GET["lang"];

        if($lang_session == 'CN') {
            $translate_from = 'EN';
            $translate_to = 'CN';
        } 
        else {
            $translate_from = 'CN';
            $translate_to = "EN";
        } 

        $query = $mysqli->query("select {$translate_to} as lang from locale_cn where {$translate_from} = '$phrase' ");
        $row = mysqli_fetch_array($query);

        if(isset($row['lang']) && $row['lang'] !== ""){

            return $row['lang'];
        }
        else{
           return $phrase;
        }
    }

【问题讨论】:

  • translate 函数有什么作用?
  • 它在数据库中查询匹配的字符串并返回结果,否则返回原始字符串...我已经更新了该函数代码的问题
  • 如果数据很好地存储在数据库中,那么我猜它是缺少 PHP 标头。

标签: php html mysql mysqli character-encoding


【解决方案1】:

有些汉字需要4个字节进行编码。 MySQL 的 CHARACTER SET uf8 停止在 3 字节编码。改成utf8mb4

mysqli_set_charset($mysqli,"utf8");
mysqli_set_charset($mysqli,"utf8mb4");

您的&lt;meta ... charset=UTF-8" /&gt; 标签是正确的。

(这也适用于表情符号。)

【讨论】:

    【解决方案2】:

    您可能还需要设置mb_internal_encoding("UTF-8");

    【讨论】:

    • 试过了,但它仍然是一样的,但是当使用并在末尾添加一个额外的空间时,它会正确显示 - mb_strtolower($row['lang'].' ', 'UTF-8') ;
    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2015-10-04
    • 2017-06-08
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多