I copy and pasted an emoticon from microsoft word :)
which became and inserted it into a mysql table where the table and field has charset utf8mb4 collation utf8mb4_unicode_ci and field type longblob. the emoticon was inserted into the table as emoticon. but when I try to display it in my html page, it became this weird character 😊
. I tried using htmlentities
, htmlspecialchars
, htmlspecialchars_decode
but none of them can display the emoticon properly.
Asked
Active
Viewed 74 times
0

dapidmini
- 1,490
- 2
- 23
- 46
-
LONGBLOB columns don't have a character set or collation property. Do you mean LONGTEXT? – Bill Karwin Aug 12 '22 at 16:39
-
2Here's some important reading on enabling utf8 content in a web presentation: https://stackoverflow.com/questions/279170/utf-8-all-the-way-through – Bill Karwin Aug 12 '22 at 16:44
-
originally the field was longtext, but I read in SO that to be able to store emoticons, the field needs to be blob type. and since the contents can be quite long, I changed it into longblob instead. before changing it into longblob I tried the other suggestions that was to change the charset and collation so I just mentioned it here just in case – dapidmini Aug 12 '22 at 16:44
-
That advice was incorrect. You can store utf8 in a `CHAR(1)`. Using BINARY or BLOB or its sibling types is not going to work, because they store binary bytes, with no associated character set. – Bill Karwin Aug 12 '22 at 16:46
-
well I did try applying the charset and collation before but the emoticon became `????` in the mysql table.. the emoticon was only inserted properly after I changed the field type into longblob. – dapidmini Aug 12 '22 at 16:49
-
`😊` is how [Windows-1252](https://en.wikipedia.org/wiki/Windows-1252) interprets the byte sequence F0 9F 98 8A, which is the UTF-8 encoding of (U+1F60A). – dan04 Aug 12 '22 at 22:29
2 Answers
0
it turns out the htmlspecialchars_decode
didn't work because I also used loadHTML
so I just need to change the code into this:
$str = htmlspecialchars_decode($row['body']);
$doc = new DOMDocument();
// @$doc->loadHTML($str); // emoticons not shown properly
@$doc->loadHTML('<?xml encoding="utf-8" ?>' . $str); // emoticons is shown properly
... // some other processes
return $doc->saveHTML();

dapidmini
- 1,490
- 2
- 23
- 46
0
The data should be inserted into a TEXT
column with CHARACTER SET utf8mb4
, not a BLOB
.
The connection parameters should include utf8mb4 and/or UTF-8, but not utf8. (This various with the product reading the data.
Do not use any encoders/decoders in PHP; that only adds to the confusion.

Rick James
- 135,179
- 13
- 127
- 222
-
I changed the database, field, and connection using utf8mb4 but when I try to insert the emoticon, it became `????` in the table.. did I do something wrong? for the connection I changed it in the `system/database/DB_driver.php` file – dapidmini Aug 13 '22 at 08:30
-
@dapidmini - See "question marks" in https://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored – Rick James Aug 13 '22 at 15:51