I'm developing a website in Brazilian Portuguese and I'm facing some really annoying encoding problems.
Words that should be written this way: óbito are being written this way: �bito
I have noticed that while the texts are still at the database they are ok. But when I use echo
with PHP, the encoding problem comes up.
List of things I have already done and did not help:
1- Set the PHP files to be saved as UTF-8
2- I'm using this meta tag <meta http-equiv="content-type" content="text/html; charset=utf-8" />
3- I used this SQL Queries:
CREATE DATABASE db_name
CHARACTER SET utf8
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci
DEFAULT COLLATE utf8_general_ci
;
ALTER DATABASE db_name
CHARACTER SET utf8
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci
DEFAULT COLLATE utf8_general_ci
;
ALTER TABLE tbl_name
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci
;
You can change the charset using this function:
$q = mysql_set_charset('utf8');
var_dump($q);
(if the function returns true it's been successful). This should fix your problems for the connection.
For older versions of PHP, you can use the following:
<?php
if (function_exists('mysql_set_charset') === false) {
/**
* Sets the client character set.
*
* Note: This function requires MySQL 5.0.7 or later.
*
* @see http://www.php.net/mysql-set-charset
* @param string $charset A valid character set name
* @param resource $link_identifier The MySQL connection
* @return TRUE on success or FALSE on failure
*/
function mysql_set_charset($charset, $link_identifier = null)
{
if ($link_identifier == null) {
return mysql_query('SET NAMES "'.$charset.'"');
} else {
return mysql_query('SET NAMES "'.$charset.'"', $link_identifier);
}
}
}
?>
It seems like PHP uses latin1 by default and I can't find a way to change the default. So I guess you'll have to use mysql_set_charset()
every time you start a new connection.
Boa Sorte.
Dont try to reinvent the wheel, keep things simple:
just use the following line after selecting the database:
mysql_query("SET NAMES 'utf8'") OR die(mysql_error());
Mine is solved by putting:
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
in the header of the page, besides creating the tables again and changing the collation of database to utf-8
encoding.
Use this for Portuguese :
<meta http-equiv="Content-Type" content="text/html; charset=pt-BR" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Putting above meta tag inside <head>
tag of your html/php document.
And you also need to run this query mysql_query("SET NAMES 'utf8'");
in your main functions file if you are using MySQL database with PHP.