如何从 MySQL 内的数据中恢复实际的 utf8 代码?
How do I recover the actual utf8 code from data within MySQL?
我将表情符号作为字符串的一部分存储在 MySQL 的文本字段中:
<div><span id="emoji_1f600">😀</span></div>
MySQL 中的字段已设置 utf8_general_ci。当数据存储到 MySQL 字段时,数据现在看起来像这样:
<div><span id="emoji_1f600">😀</span></div>
我假设这是因为表情符号的存储方式。如果我在这一点上错了,请告诉我,因为我认为我会看到 😀 的 unicode 而不是奇怪的字符。
然后,我将 MySQL 字段中的数据提取到 php var 中,并执行一个子字符串以获取 span 标签之间的实际表情符号。 php var 中的值现在如下所示:
"C0E8Kb,"
我的代码试图通过执行以下操作取回 unicode:
$code = utf8_encode($code) //$code contains the string "C0E8KB,"
结果是"CB0CB8CBC"BB,"
我显然没有正确处理表情符号 utf8 代码,欢迎任何帮助和指导。
提前致谢。
我并不是一直都需要 UTF8。就在一个领域。 MySOL 中的字段类型为 utf8。
好的,我在问题描述中犯了一个重大错误。确实,我的代码产生了以下 html
<div><span id="emoji_1f600">😀</span></div>
但是,这个 html 是在来自第 3 方的编辑器中,我的 span 标签中的表情符号代码实际上被呈现为表情符号。所以当我从编辑器中保存数据时,我从编辑器中得到的结果如下:
<div>test 2 <span id="emoji_1f600">😀</span></div>
我假设 span 标签之间的奇怪字符是实际的表情符号,因为它正在被渲染。这样可以吗,还是我应该在将它存储在数据库中之前用实际的 😀 代码替换它?我担心的是,如果我这样做,那么当我将数据库中的字符串放入要呈现的 html 字符串时,将不会呈现实际的表情符号。
utf8_encode 不应使用,因为您的数据库已经是 UTF-8;它从 ISO-8859-1(通常用 MySQL 找到)编码为 UTF-8;如果您的数据已经是 utf-8 编码,它可能会产生错误的字符。包含要存储的数据的 html 页面是否声明为 utf-8?像这样:
<head>
<meta charset="UTF-8">
</head>
我很无聊所以我尝试了以下代码没有问题:
`<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div><span id="emoji_1f600">😀</span></div>
<?php
$mysqli=new mysqli("127.0.0.1", "root", "","utf8_general_mysql");
$num=1;
$text="😀";
$stmt = $mysqli->prepare("INSERT INTO testtable VALUES (?, ?)");
$stmt->bind_param('ds', $num, $text);
$stmt->execute();
echo '<div><span id="emoji_1f600">😀</span></div>';
$stmt = $mysqli->prepare("SELECT * FROM testtable WHERE testtable.text='😀'");
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_array(MYSQLI_NUM))
{
foreach ($row as $r)
{
print "$r ";
}
print "\n";
}
?>
</body>
</html>`
编辑...:
我真的认为这与你有关 headers content-type :
尝试添加:
header('Content-type: text/html; charset=utf-8');
然后尝试
header('Content-type: text/html; charset=iso-8859-1');
(这就是你的设置方式)
在要向 MySQL 插入数据的页面上,这里有 2 个不同的行:
我认为元字符集不起作用,因为可以在其他地方设置 http headers,这些 PHP 行应该可以解决问题,希望如此。
要获得这些行,我必须设置 headers 并将之前的 $text 值替换为我的代码示例中的 $text=""。
您的问题是假设 MySQL 的名为 utf8 的字符集实际上是 utf8。它不是。 MySQLs utf8 是 utf8 的 3 字节子集,不包含表情符号。为了告诉 MySQL 以后不要破坏您的数据,并在为该行提供无效字符时给出错误,启用 STRICT_TRANS_TABLES sql_mode。为了使mysql使用真正的4字节utf8,使行字符集"utf8mb4"——简而言之,mysqls utf8是一个弱命名的utf8子集,真正的utf8称为MySQL 中的 utf8mb4。 (顺便说一句,MariaDB 也是如此,它从 MySQL 源代码中继承了这种脑损伤)
我将表情符号作为字符串的一部分存储在 MySQL 的文本字段中:
<div><span id="emoji_1f600">😀</span></div>
MySQL 中的字段已设置 utf8_general_ci。当数据存储到 MySQL 字段时,数据现在看起来像这样:
<div><span id="emoji_1f600">😀</span></div>
我假设这是因为表情符号的存储方式。如果我在这一点上错了,请告诉我,因为我认为我会看到 😀 的 unicode 而不是奇怪的字符。
然后,我将 MySQL 字段中的数据提取到 php var 中,并执行一个子字符串以获取 span 标签之间的实际表情符号。 php var 中的值现在如下所示:
"C0E8Kb,"
我的代码试图通过执行以下操作取回 unicode:
$code = utf8_encode($code) //$code contains the string "C0E8KB,"
结果是"CB0CB8CBC"BB,"
我显然没有正确处理表情符号 utf8 代码,欢迎任何帮助和指导。
提前致谢。
我并不是一直都需要 UTF8。就在一个领域。 MySOL 中的字段类型为 utf8。
好的,我在问题描述中犯了一个重大错误。确实,我的代码产生了以下 html
<div><span id="emoji_1f600">😀</span></div>
但是,这个 html 是在来自第 3 方的编辑器中,我的 span 标签中的表情符号代码实际上被呈现为表情符号。所以当我从编辑器中保存数据时,我从编辑器中得到的结果如下:
<div>test 2 <span id="emoji_1f600">😀</span></div>
我假设 span 标签之间的奇怪字符是实际的表情符号,因为它正在被渲染。这样可以吗,还是我应该在将它存储在数据库中之前用实际的 😀 代码替换它?我担心的是,如果我这样做,那么当我将数据库中的字符串放入要呈现的 html 字符串时,将不会呈现实际的表情符号。
utf8_encode 不应使用,因为您的数据库已经是 UTF-8;它从 ISO-8859-1(通常用 MySQL 找到)编码为 UTF-8;如果您的数据已经是 utf-8 编码,它可能会产生错误的字符。包含要存储的数据的 html 页面是否声明为 utf-8?像这样:
<head>
<meta charset="UTF-8">
</head>
我很无聊所以我尝试了以下代码没有问题:
`<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div><span id="emoji_1f600">😀</span></div>
<?php
$mysqli=new mysqli("127.0.0.1", "root", "","utf8_general_mysql");
$num=1;
$text="😀";
$stmt = $mysqli->prepare("INSERT INTO testtable VALUES (?, ?)");
$stmt->bind_param('ds', $num, $text);
$stmt->execute();
echo '<div><span id="emoji_1f600">😀</span></div>';
$stmt = $mysqli->prepare("SELECT * FROM testtable WHERE testtable.text='😀'");
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_array(MYSQLI_NUM))
{
foreach ($row as $r)
{
print "$r ";
}
print "\n";
}
?>
</body>
</html>`
编辑...:
我真的认为这与你有关 headers content-type :
尝试添加:
header('Content-type: text/html; charset=utf-8');
然后尝试
header('Content-type: text/html; charset=iso-8859-1');
(这就是你的设置方式)
在要向 MySQL 插入数据的页面上,这里有 2 个不同的行:
我认为元字符集不起作用,因为可以在其他地方设置 http headers,这些 PHP 行应该可以解决问题,希望如此。
要获得这些行,我必须设置 headers 并将之前的 $text 值替换为我的代码示例中的 $text=""。
您的问题是假设 MySQL 的名为 utf8 的字符集实际上是 utf8。它不是。 MySQLs utf8 是 utf8 的 3 字节子集,不包含表情符号。为了告诉 MySQL 以后不要破坏您的数据,并在为该行提供无效字符时给出错误,启用 STRICT_TRANS_TABLES sql_mode。为了使mysql使用真正的4字节utf8,使行字符集"utf8mb4"——简而言之,mysqls utf8是一个弱命名的utf8子集,真正的utf8称为MySQL 中的 utf8mb4。 (顺便说一句,MariaDB 也是如此,它从 MySQL 源代码中继承了这种脑损伤)