2017-07-14 26 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というユニコードを見たと思ったので、私がこの点について間違っていると教えてください。

私はMySQLのフィールドからphp varにデータを取得し、部分文字列を使ってspanタグの間の実際の絵文字を取得します。 PHP varに値が次のようになります。

「C0E8Kb、」

私のコードは次のようにして戻ってユニコードを取得しようとする試みを行います

$code = utf8_encode($code) //$code contains the string "C0E8KB," 

結果が「CB0CB8CBCです「BB、」

私は明らかに適切に絵文字UTF8コードを処理し、任意およびすべてのヘルプや命令を歓迎しておりません。事前に

感謝。

私は本当にUTF8を完全に必要としません。ただ1つのフィールドに。 MySOLのフィールドにはutf8と入力されています。

いいえ私は問題の説明に大きな間違いをしました。私のコードは

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

しかし、このHTMLを実際に絵文字としてレンダリングされているサードパーティと私のspanタグ内の絵文字コードからエディタ内にある次のHTMLを生成していることは事実です。私は編集者からのデータを保存するときに、私は戻って、エディタから取得することは以下の通りです:

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

私は、spanタグの間に奇妙な文字を想定しています、それがレンダリングされているため、実際の絵文字です。これはそのままですか、それともデータベースに格納する前に実際の&#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

DBは既にUTF-8であるため、utf8_encodeは使用しないでください。 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

DBに保存する方法を説明できますか?可能であれば "&#x1f600"というように保管しておくべきだと思いますが、私はあなたがそれをやることを拘束しているかどうか分かりません。 htmlとしてレンダリングすれば、ブラウザは自分で絵文字を表示できるはずです。 – knrf

+0

はい、それは私がしたいことです。しかし、エディタ(問題の説明の私の最後のコメントで言及されているように)は、私に戻ってÁŸ~€を渡しています。 PHPを使って&#x1f600に戻すにはどうすればいいですか?もし私がそれをすることができれば、私の問題は解決されるだろう。 – Tim

0

あなたの問題は、utf8というMySQLの文字セットが実際にutf8であると仮定しています。そうではありません。 MySQLのutf8は、emojisをカバーしないutf8の3バイトのサブセットです。将来的にあなたのデータを壊さないようにMySQLに指示し、行に無効な文字が与えられたときにエラーを返すようにするには、STRICT_TRANS_TABLES sql_modeを有効にします。 mysqlが実際の4バイトのutf8を使用するようにするには、行の文字セットを「utf8mb4」にします。つまり、mysqls utf8は遅延の名前付きutf8サブセットであり、実際のutf8はMySQLではutf8mb4と呼ばれます。 (これは、MariaDB btwにも当てはまります。これは、MySQLのソースコードからこの脳の損傷を受け継いだものです)

関連する問題