'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.