'Issue with UTF-8 encoding using PHP + MySQL
I moved data from MySQL 4 (they were originally set to latin2 encoding) to MySQL 5 and set the encoding to UTF-8. It looks good in phpMyAdmin, and UTF-8 is okay. However, there are question marks instead of some characters on the website! The website encoding is also set to UTF-8, so I don’t understand where the problem is.
PHP and HTML files are also set to UTF-8.
How can I fix this?
Solution 1:[1]
Try the query
SET NAMES utf8
before any query in your application.
Solution 2:[2]
On my server, adding these to my PHP file had no effect:
ini_set('default_charset', 'utf-8');
mysql_set_charset('utf8');
header('Content-type: text/html; charset=utf-8');
But everything worked perfectly once I added this to the top of my PHP file:
$mysqli->query("SET NAMES 'utf8'");
Note: I am using encoding utf8_general_ci in my database, but utf8_unicode_ci works the same for me.
Solution 3:[3]
Try setting the MySQL connection to UTF-8:
SET NAMES 'utf8'
And send explicit UTF-8 headers, just in case your server has some other default settings:
header('Content-type: text/html; charset=utf-8');
Solution 4:[4]
You don't have to set your PHP and HTML files to utf-8.
You just have to set your output encoding to UTF-8 and the browser will display appropriately.
In HTML:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
In PHP:
header('Content-Type: text/html; charset=UTF-8');
When you get a string that is UTF-8 from the MySQL table, it will be UTF-8 all the way to browser output unless you convert the encoding. It's the way that the browser interprets it.
Solution 5:[5]
Put a .htaccess file in your web-site root with content: AddDefaultCharset UTF-8
and
in your dbconfig set after connection to the database:
mysql_query("SET NAMES 'utf8'");
Solution 6:[6]
When you show UTF-8 characters on a website, but tell the browser to interpret them as Latin-1 (or Latin-2) you see this kind of gibberish: ß
When you show Latin-1 (or Latin-2) characters on a website, but tell the browser to interpret them as UTF-8, you see question marks.
So my guess is that you switched everything to UTF-8 (I mean, you told the database engine, the web server and the browser you would be using UTF-8), but you didn't actually convert the strings to UTF-8.
Do what Darkerstar said. Convert your dump to UTF-8 (Notepad++ can do that easily) and import it again.
Solution 7:[7]
mysql_query("SET NAMES UTF8");
Adding this line at the end of my "connection.php" solved my problem.
My connection file's complete code is:
<?php
# FileName="Connection_php_mysql.htm"
# Type="MYSQL"
# HTTP="true"
$hostname_test = "localhost";
$database_test = "test";
$username_test = "username";
$password_test = "password";
$test = mysql_pconnect($hostname_test, $username_test, $password_test) or trigger_error(mysql_error(), E_USER_ERROR);
mysql_query("SET NAMES UTF8");
?>
My database collation is "utf8_general_ci".
Pages are "dreamweaver default utf8" and "unicode normalisation form=C (Canonical Decomposition)".
Solution 8:[8]
Here is a fix. Set the header to header ('Content-type: text/html; charset=utf-8'); Then print your content using utf8_decode($content). You must have the two to make it work.
Solution 9:[9]
I had this problem recently (I hope it’s the same problem you are having), and I tried many ways, but at the end what worked was really simple.
Convert your dumped SQL file to UTF-8 format and then import it.
BTW: I used Notepad++ for the conversion.
Solution 10:[10]
It doesn't seem like setting every SQL database, table, and field to UTF-8 in MySQL is good enough. Very annoying.
I ended up forcing the issue to solve encoding problems:
I had to use this every place I open the database:
$db->set_charset("utf8");
And that worked. Finally.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
