PHP not displaying some UTF-8 characters correctly - php

PHP is retriving data from MySQL database. Now it's suppose to display the results to screen, but since my database contains characters like (ä,ö,ü,õ), which PHP displays (�,䄔). Database displays all characters correctly, so I don't think the problem is there.
I add following line to my code, that sets charset to UTF-8.
$conn->set_charset("utf8");
After adding that line, PHP displays following characters „”.
Also tried:
$conn->query("SET character_set_results=utf8");
$conn->query("SET NAMES 'utf8'");
How can I get PHP to display correct characters?
Here is the important part of my code
$conn = new mysqli($servername, $username, $password, $dbname);
$sql = "SELECT name FROM employee";
$stmt = $conn->prepare($sql);
$stmt->execute();
$stmt->bind_result($employee);
while($stmt->fetch()){
echo "$employee|";
}
$stmt->close();
$conn->close();
I'm running on PHP 7 and MySQL 10.1.19-MariaDB.

Consider the following things in this situations.
Make sure the header match the following
Content-Type:text/html; charset=UTF-8
and try setting UTF-8 in html
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
The source file encoding can make problems when string are hard coded in file. Since this file echoing it that seem to be no issue.

Related

How to read a Persian string from MySql in PHP?

I inserted persian string to my table rows in my database, where my columns collection is set to utf8mb4_persian_ci.
But when i want read data from MySql database to php , it doesn't show persian string correctly and just shows ? ? ? ?
I read many article for fix this problem but it didn't work for me
I used this code after connecting to database
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
$mysqli->set_charset("utf8");
And this code at header of php codes
header("Content-Type: text/html;charset=UTF-8");
And this code at top of html codes
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
But it don't work and I can't see persian string in php pages where it's read from MySql to php
How to fix this problem?
This is the code I used to get this to work properly, since I used all your code, this means your mysql database configuration is incorrect, please recreate your database with the right collation, make sure the table collation is also the same and the field type to be TEXT
Here is the code:
<?php
$mysqli = new mysqli('localhost', 'root', '', 'persian');
$mysqli->set_charset("utf8");
header("Content-Type: text/html;charset=UTF-8");
$mysqli->query("INSERT INTO user SET name='فارسی / پارسی'");
$result = $mysqli->query("SELECT * FROM user");
$result = $result->fetch_object();
echo '<pre dir="ltr">';var_dump($result);echo '</pre>';
echo $result->name;?>
$mysqli->set_charset("utf8");
header("Content-Type: text/html;charset=UTF-8");
instead of $mysqli->set_charset("utf8"); try
$mysqli->set_charset("windows-1256");

UTF 8 encoding not working properly in PHP

I am trying to print data from MySql database.
I have a simple problem it is showing D�lar instead of Dólar .
Although I have included
<META http-equiv="Content-Type" Content="text/html; charset=utf-8">
In my html page so can any one help me out with this
Thanks in Advance
The character set needs to be defined in a few different places:
The MySQL database
The text stored in the database might not be encoded as UTF-8. You can define a default character set as part of the create database statement:
CREATE DATABASE mydb CHARACTER SET utf8;
You can also specify per-column character sets with create table.
Within your PHP code
You'll need to tell your client-side code which encoding it should use when communicating with the database.
If you're using PDO, you can specify the character set as part of the DSN string:
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8';
$dbh = new PDO($dsn, $username, $password);
If you're using MySQLi, you can use the mysqli_set_charset() function/method:
$dbh->set_charset('utf8');
or:
mysqli_set_charset($dbh, 'utf8');
Alternatively, the MySQL website suggests issuing a statement after connecting to the server:
SET NAMES 'utf8';
Within the HTML output
For HTML5, you can simply add the following <meta> tag within the <head> element of your output:
<meta charset="utf-8">
I've used bellow function and its working for me
call_user_func_array('mb_convert_encoding', array(&$str,'HTML-ENTITIES','UTF-8'));

How do i have a SQL query with UTF-8 chars in?

<?php
$path = "mysql:host=localhost;dbname=kanjisearch;charset=utf-8";
$pdo = new PDO($path, "xxx", "xxx");
$sth = $pdo->prepare("SELECT * FROM `kanji` WHERE `kanjiName` = '$kanji'");
$sth->execute();
$results = $sth->fetchAll();
?>
I am building a PHP search that uses Chinese characters in the actual SQL query, I have -> exec("SET CHARACTER SET utf8"); on the pdo. And it renders just fine, the text I bring back renders the charects great, if I put numbers ins the sql but I need to search based on the Kanji, so when I query with WHERE kanji = 一, the 一 doesn't seem to go through ok, it renders on the screen on the debug, but just wont query, results return empty but when I copy the query directly into PHPMyAdmin it returns the result.
Were your tables and or columns created with the UTF-8 character set as the default encoding? By default MySQL creates tables with a latin based charset and collate options. UTF-8, especially none latiin characters, gets mangled when it is saved in a latin encoded column.
Try changing the table's charset to use UTF8 using the ALTER table command and reloading/inserting your data.
Try add encoding (accept-charset="UTF-8" and charset=utf-8") to your form and html head:
<form method="post" action="yourAction" accept-charset="UTF-8">
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
EDIT: also have a look at this similar question here. (by shark555)
$pdo = new PDO(
'mysql:host=hostname;dbname=defaultDbName',
'username',
'password',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
$kanji needs to be handled as a particular/specific character set.
so, what's typed in is likely not seen as a UTF-8 encoded string. you need to handle this.
note: http://www.fileformat.info/info/unicode/char/4e00/index.htm
basically you want to convert to UTF-8. but try this:
http://us1.php.net/mb_convert_encoding
like
mb_convert_encoding($text, 'UTF-8');
or if you know the encoding of the language stick as the 3rd param.
or try auto: mb_convert_encoding($text, 'UTF-8', 'auto');

UTF-8 and German characters?

I have problem with German characters on my web site,
in html/php part of website i have this code to set utf-8:
<meta charset="utf-8">
in mysql, i have this code to set utf-8
SET CHARSET 'utf8';
Here is some word on German: Gemäß
Here is how that word looks in mysql table:
Gemäß
Here is how that word is shown on the site: Gemäß
What is a problem? Thanks.
I was using this code to get title:
$title = mysql_real_escape_string(htmlentities($_POST['title']));
I just override that to
$title = $_POST['title'];
At first, make sure, that you have UTF-8 characters in your database.
After that, try using SET NAMES 'UTF8' after connecting to MySQL:
$con=mysqli_connect("host", "user", "pw", "db");
if (!$con)
{
die('Failed to connect to mySQL: ' .mysqli_connect_errno());
}
mysqli_query($con, "SET NAMES 'UTF8'") or die("ERROR: ". mysqli_error($con));
As the manual says:
SET NAMES indicates what character set the client will use to send SQL
statements to the server... It also specifies the character set that the server should
use for sending results back to the client.
Try SET NAMES 'utf8' or SET NAMES 'utf-8'. Some of these works fine for portuguese, probably for german too. I just can't remember which one is correct, but if it is not, an error will be produced.
you should make sure that the CONNECTION is also utf-8.
with mysqli this is done with something like this:
$connection = mysqli_connect($host, $user, $pass, $db_name);
$connection->set_charset("utf8");
Now if somehow you ended up with wrong characters in the database there is a way to make it right:
in a PHP script, retrieve the information as you do now, i.e without setting the connection. This way the mistake will be inverted and corrected and in your php file you will have the characters in the correct utf-8 format.
in a PHP script, write back the information with setting the connection to utf-8
at this point you should see the character correct in your database
now change all your read/write functions of your site to use the utf-8 from now on
in HTML5 use
<meta charset="utf-8">
in HTML 4.0.1 use
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
the results are html entity encoded as if they were processed by htmlentities(), I wonder if your variables are ibserted as received from the form or are being processed by say a wysiwg editor for instance?
Anyway, these should print fine on an html template but an html_entity_decode() should do it to.
Hope this helps
Set the data type in your database to use UTF-8 as well, this should solve the problem.
I had the same problem. which I solved by using:
if you have already created your table, you need the modify the character set as:
alter table <table name> convert to character set utf8 collate utf8_general_ci.
your tables character set is set to latin_swedish by default by MySQL.
also, you might face some problems while retrieving the data and displaying it to you page.For that include: mysql_set_charset('utf8') just below the line where you have connected your database.
eg:
mysql_connect('localhost','root','');
mysql_select_db('my db');
mysql_set_charset('utf8');
You will need to do this for php 5.x
$yourNiceLookingString =
htmlspecialchars ($YourStringFromDB, ENT_COMPAT | ENT_HTML401, 'ISO-8859-1');
and for php 4.x
$yourNiceLookingString = htmlspecialchars($YourStringFromDB);

Save Accents in MySQL Database

I'm trying to save French accents in my database, but they aren't saved like they should in the DB.For example, a "é" is saved as "é".I've tried to set my files to "Unicode (utf-8)", the fields in the DB are "utf8_general_ci" as well as the DB itself.When I look at my data posted through AJAX with Firebug, I see the accent passed as "é", so it's correct.Thanks and let me know you need more info!
Personally I solved the same issue by adding after the MySQL connection code:
mysql_set_charset("utf8");
or for mysqli:
mysqli_set_charset($conn, "utf8");
or the mysqli OOP equivalent:
$conn->set_charset("utf8");
And sometimes you'll have to define the main php charset by adding this code:
mb_internal_encoding('UTF-8');
On the client HTML side you have to add the following header data :
<meta http-equiv="Content-type" content="text/html;charset=utf-8" />
In order to use JSON AJAX results (e.g. by using jQuery), you should define the header by adding :
header("Content-type: application/json;charset=utf8");
json_encode(
some_data
);
This should do the trick
The best bet is that your database connection is not UTF-8 encoded - it is usually ISO-8859-1 by default.
Try sending a query
SET NAMES utf8;
after making the connection.
mysqli_set_charset($conn, "utf8");
if you use PDO, you must instanciate like that :
new \PDO("mysql:host=$host;dbname=$schema", $username, $password, array(\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8') );
Use UTF8:
Set a meta in your
<meta http-equiv="Content-type" content="text/html;charset=utf-8" />
When you connect to your mySQL DB, force encoding so you DONT have to play with your mysql settings
$conn = mysql_connect('server', 'user', 'password') or die('Could not connect to mysql server.');
mysql_select_db('mydb') or die('Could not select database.');
mysql_set_charset('utf8',$conn); //THIS IS THE IMPORTANT PART
If you use AJAX, set you encoding like this:
header('Content-type: text/html; charset=utf-8');
Have you reviewed http://dev.mysql.com/doc/refman/5.0/en/charset-unicode.html:
Client applications that need to
communicate with the server using
Unicode should set the client
character set accordingly; for
example, by issuing a SET NAMES 'utf8'
statement. ucs2 cannot be used as a
client character set, which means that
it does not work for SET NAMES or SET
CHARACTER SET. (See Section 9.1.4,
“Connection Character Sets and
Collations”.)
Further to that:
if you get data via php from your
mysql-db (everything utf-8) but still
get '?' for some special characters in
your browser (), try this:
after mysql_connect() , and
mysql_select_db() add this lines:
mysql_query("SET NAMES utf8");
worked for me. i tried first with the
utf8_encode, but this only worked for
äüöéè... and so on, but not for
kyrillic and other chars.
You need to a) make sure your tables are using a character encoding that can encode such characters (UTF-8 tends to be the go-to encoding these days) and b) make sure that your form submissions are being sent to the database in the same character encoding. You do this by saving your HTML/PHP/whatever files as UTF-8, and by including a meta tag in the head that tells the browser to use UTF-8 encoding.
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Oh, and don't forget C, when connecting to the database, make sure you're actually using the correct character set by executing a SET NAMES charset=utf8 (might not be the correct syntax, I'll have to look up what it should be, but it will be along those lines)
PHP(.net) advises against setting charsets after connecting using a query like SET NAMES utf8 because your functionality for escaping data inside MySQL statements might not work as intended.
Do not use SET NAMES utf8 but use the appropriate ..._set_charset() function (or method) instead, in case you are using PHP.
Ok I have found a working solution for me :
Run this mysql command
show variables like 'char%';
Here you have many variables : "character_set_server", "character_set_system" etc.
In my case I have "é" for "é" in database and I want to show "é" on my website.
To work I have to change "character_set_server" value from "utf8mb4" to "latin1".
All my correct value are :
And other values are :
With theses values the wrong database accent are corrected and well displayed by the server.
But each case can be different.

Categories