2017-07-14 77 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源代碼的這種腦損傷)