PHP + MySQL encoding issues for Portuguese (PT-Br)

2019-07-27 01:40发布

问题:

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
    ;

回答1:

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.



回答2:

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()); 


回答3:

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.



回答4:

Use this for Portuguese :

<meta http-equiv="Content-Type" content="text/html; charset=pt-BR" />


回答5:

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