Fix incorrectly displayed encoding on an html document with php
- You need to save the page with
UTF-8 without BOM
encoding. Add this header on top of your script:
header("Content-Type: text/html; charset=UTF-8");
[EDIT]: How to Save Files as UTF-8 without BOM :
On OP request, here's how you can do on Windows:
- Download Notepad++. It is an awesome text-editor that you should be using.
- Install it.
- open the PHP script in Notepad++ that contains this code. The page where you are doing all the coding. Yes, that file on your computer.
- In Notepad++, from the Encoding menu at the top, select "Convert to UTF-8 without BOM".
- Save the file.
- Upload to your webserver by FTP or whatever you use.
- Now, run that script.
How I can solve my PHP web page file language encoding?
Check your database connection, make sure the sybase_connect
connects with UTF-8 as charset.
See http://php.net/manual/en/function.sybase-connect.php
From the comment that you are using ODBC to connect: There seems to be an issue with PHP/ODBC and UTF8. Some suggestions are mentioned in this thread: Php/ODBC encoding problem
how to fix The character encoding of the HTML document was not declared
From the error you get, please add this to your <head> ... </head>
:
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-5">
If the charset above did not work, please try this instead:
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="utf-8" http-equiv="encoding">
And I hope you defined the before BODY part of your pages as this:
<!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<HEAD>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="utf-8" http-equiv="encoding">
<title> Your Title</title>
</HEAD>
<BODY>
....
EDIT 2:
Before including other any other PHP files in your members.php
, type this line first:
header('Content-type: text/html; charset=utf-8');
PHP messing with HTML Charset Encoding
You have probably come to mix encoding types.
For example. A page that is sent as iso-8859-1, but get UTF-8 text encoding from MySQL or XML would typically fail.
To solve this problem you must keep control on input ecodings type in relation to the type of encoding you have chosen to use internal.
If you send it as an iso-8859-1, your input from the user is also iso-8859-1.
header("Content-type:text/html; charset: iso-8859-1");
And if mysql sends latin1 you do not have to do anything.
But if your input is not iso-8859-1 you must converted it, before it's sending to the user or to adapt it to Mysql before it's store.
mb_convert_encoding($text, mb_internal_encoding(), 'UTF-8'); // If it's UTF-8 to internal encoding
Short it means that you must always have input converted to fit internal encoding and convereter output to match the external encoding.
This is the internal encoding I have chosen to use.
mb_internal_encoding('iso-8859-1'); // Internal encoding
This is a code i use.
mb_language('uni'); // Mail encoding
mb_internal_encoding('iso-8859-1'); // Internal encoding
mb_http_output('pass'); // Skip
function convert_encoding($text, $from_code='', $to_code='')
{
if (empty($from_code))
{
$from_code = mb_detect_encoding($text, 'auto');
if ($from_code == 'ASCII')
{
$from_code = 'iso-8859-1';
}
}
if (empty($to_code))
{
return mb_convert_encoding($text, mb_internal_encoding(), $from_code);
}
return mb_convert_encoding($text, $to_code, $from_code);
}
function encoding_html($text, $code='')
{
if (empty($code))
{
return htmlentities($text, ENT_NOQUOTES, mb_internal_encoding());
}
return mb_convert_encoding(htmlentities($text, ENT_NOQUOTES, $code), mb_internal_encoding(), $code);
}
function decoding_html($text, $code='')
{
if (empty($code))
{
return html_entity_decode($text, ENT_NOQUOTES, mb_internal_encoding());
}
return mb_convert_encoding(html_entity_decode($text, ENT_NOQUOTES, $code), mb_internal_encoding(), $code);
}
Problem writing UTF-8 encoded file in PHP
First off, don't depend on mb_detect_encoding
. It's not great at figuring out what the encoding is unless there's a bunch of encoding specific entities (meaning entities that are invalid in other encodings).
Try just getting rid of the mb_detect_encoding
line all together.
Oh, and utf8_encode
turns a Latin-1
string into a UTF-8
string (not from an arbitrary charset to UTF-8
, which is what you really want)... You want iconv
, but you need to know the source encoding (and since you can't really trust mb_detect_encoding
, you'll need to figure it out some other way).
Or you can try using iconv
with a empty input encoding $str = iconv('', 'UTF-8', $str);
(which may or may not work)...
PHP seems to output HTML code incorrectly and with hidden characters
As others have said BOMs are a problem when including PHP files, even if those files do not echo anything
PHP includes
At the time this article was written, if you include some external
file in a page using PHP and that file starts with a BOM, it may
create blank lines.This is because the BOM is not stripped before inclusion into the
page, and acts like a character occupying a line of text.You should ensure that the included files do not start with a BOM.
in: http://www.w3.org/International/questions/qa-byte-order-mark
Detecting BOMs
You can online detect BOMs within the content of your HTML page using the W3C Internationalization Checker
Related Topics
Mysqli + Xdebug Breakpoint After Closing Statement Result in Many Warnings
PHP String Interpolation Syntax
How to Correct the [Composer\Downloader\Transportexception] Error for Composer
Transfer Variables Between PHP Pages
What's Difference Between _Construct and Function with Same Name as Class Has
Pushnotification Server Side Implementation
Cron Command to Run Url Address Every 5 Minutes
Laravel 5 - Env() Always Returns Null
Laravel - Database, Table and Column Naming Conventions
How to Use Array_Unique on an Array of Arrays
JavaScript Function Post and Call PHP Script