2017-07-14 83 views
0

我的存储表情符号,文本字段MySQL中的字符串的一部分:如何从MySQL中的数据恢复实际的utf8代码?

<div><span id="emoji_1f600">&#x1f600</span></div> 

领域的MySQL有utf8_general_ci设置。当数据被存储在MySQL的领域,数据现在看起来是这样的:

<div><span id="emoji_1f600">😀</span></div> 

我假设是因为表情符号的存储方式。请教我如果我在这一点上是错误的,因为我想我会看到&#x1f600的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">&#x1f600</span></div> 

然而,这个网站是从第三方和我的span标签内表情符号的代码编辑器实际上是被渲染为表情符号之内。所以,当我从保存编辑器中的数据,我所得到的从编辑回如下:

<div>test 2 <span id="emoji_1f600">😀</span></div> 

我假设的跨度标签之间的奇怪字符是实际的表情符号,因为它正在呈现。这是好的,还是应该用实际的&#x1f600代码替换它,然后将它存储到数据库中?我担心的是,如果我这样做,那么当我将数据库中的字符串放入要呈现的html字符串时,实际的表情符号将不会呈现。

+2

https://stackoverflow.com/questions/279170/utf-8-all-the-way-through – arkascha

+0

[UTF-8一路通过]的可能重复(https://stackoverflow.com/questions/279170/utf-8-all-the-way-through) –

+0

感谢您的信息。我完全理解,但这不是我想追求的道路。那么你能否告诉我用于在字符串中嵌入表情符号的最佳机制或技术,而不需要全部转换为utf8? – Tim

回答

0

utf8_encode不应该用作你的DB已经是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">&#x1f600</span></div> 
<?php 
$mysqli=new mysqli("127.0.0.1", "root", "","utf8_general_mysql"); 
$num=1; 
$text="&#x1f600"; 
$stmt = $mysqli->prepare("INSERT INTO testtable VALUES (?, ?)"); 
$stmt->bind_param('ds', $num, $text); 
$stmt->execute(); 
echo '<div><span id="emoji_1f600">&#x1f600</span></div>'; 
$stmt = $mysqli->prepare("SELECT * FROM testtable WHERE testtable.text='&#x1f600'"); 
$stmt->execute(); 
$result = $stmt->get_result(); 
while ($row = $result->fetch_array(MYSQLI_NUM)) 
     { 
      foreach ($row as $r) 
      { 
       print "$r "; 
      } 
      print "\n"; 
     } 

?> 
</body> 
</html>` 

编辑...:

我真的认为这与你的头内容类型做:

尝试添加:你在页面上 header('Content-type: text/html; charset=utf-8'); 然后尝试 header('Content-type: text/html; charset=iso-8859-1');(这是你似乎可以套) 插入数据到MySQL,这里是2个不同的行: enter image description here

我认为元字符集不起作用,因为http头可以设置在其他地方,这些PHP行应该做的伎俩,希望。

要得到这些行,我必须设置标题并用$ text =“”替换之前的$ text值到我的代码示例中。

+0

谢谢你帮助我更好地理解了这个问题。然而,在描述可能仍然有帮助的问题时,我却犯了一个错误。请参阅我更新的问题描述。我真的很感谢你的帮助! – Tim

+0

你能描述一下你存储在数据库中的方式吗?我认为你应该保存它,如果可能的话,“#x1f600”,但我不确定是什么阻止你这么做;如果你只是把它呈现为html,你的浏览器应该能够自己显示表情符号。 – knrf

+0

是的,这是我想要做的。然而,编辑(正如我在问题描述中的最后一个评论中所提到的)将我交给了我。如何将其转换回使用php的&#x1f600?如果我能做到这一点,那么我的问题就会解决。 – Tim

0

你的问题是假设MySQL的characteret称为utf8实际上是utf8。事实并非如此。 MySQLs utf8是utf8的一个3字节子集,不包含表情符号。为了告诉MySQL不会在将来破坏你的数据,并且在给出行的无效字符时给出错误,请启用STRICT_TRANS_TABLES sql_mode。为了让mysql使用真正的4字节utf8,使行字符集为“utf8mb4” - 简而言之,mysqls utf8是一个名为utf8的子集,而真正的utf8在MySQL中被称为utf8mb4。 (对于MariaDB btw也是如此,它继承了来自它的MySQL源代码的这种脑损伤)