Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP Japanese echo string becomes question marks

Tags:

php

I'm working on a php site that needs both Japanese and English. In most places I have no trouble getting the Japanese to display correctly, but I can't get the characters to display if I use a function like this:

echo.php:

<?php
function draw(){
echo "日本語";
}
draw();
?>

I get "日本語"

but if I try this : index.php:

<?php
 some stuff
 include "echo.php";
 draw();
?>

I get "???". Is there any way for me to get my echo file to send the data to the first file in a way it can read it?

EDIT: The website works, and shows Japanese characters correctly, except when it tries to pull a function from a php file Here's the code:

<html lang="ja">
<head>  
<title>Running Projects</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body>
<div id="header">
<? php include "layout.php" ?>
</div>
</body>
</html>

Where layout.php is just a file with a list of links, I have this on each page so the links are on every page. For a different part, I have to use functions.php to get some data from a database and write it to the page, so, I tried putting layout.php into the functions.php and calling it: The English links appeared, but the Japanese links appeared as question marks.

like image 802
Asitaka Avatar asked Apr 04 '12 07:04

Asitaka


3 Answers

You should change your file encoding to UTF-8 and set the header on the website to UTF-8.

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

in HTML5 you should use:

<meta charset="utf-8" /> 

or in php

header('content-type: text/html; charset=utf-8');
like image 54
René Höhle Avatar answered Sep 19 '22 00:09

René Höhle


You problem definitely has something to do with the character encoding. Try to check the following:

  • All your strings in all PHP scripts are Unicode (UTF-8 is a very common choice). Use utf8_encode() and/or utf8_decode() to force UTF-8 on your strings where necessary.
  • Your server sends PHP output as Unicode (UTF-8 and preferably, but not necessarily, gzipped data)
  • Your browser understands and accepts Unicode (UTF-8). Typically browser would send Accept-Charset: UTF-8,*;q=0.5 in the GET request to hint it's Unicode capability.

Finally, I have checked your code with PHP version 5.3.6 and Firefox, Chrome and IE 9. Firefox and Chrome prints the Japanese characters as expected. It's only IE 9 which doesn't print it correctly. Snooping on the GET request from IE reveals, it is indeed not sending any Accept-Charset: UTF-8,*;q=0.5. I am not entirely sure how to force IE to send that because in my case, clearly my server (Apache) together with PHP was definitely sending UTF-8 string back.

One more hint - you may try converting your strings into HTML entities. For example - echo "&#x00A9;"; would print ©. But, I am not 100% sure how to convert all strings into HTML entities using PHP. I have unsuccessfully attempted with htmlentities() and htmlspecialchars(). But, it didn't change anything for IE.

like image 30
gsbabil Avatar answered Sep 18 '22 00:09

gsbabil


i have same problem. But i handle it.

convert "echo.php"'s encoding to EUC-JP or SHIFT-JIS.

<?php
function draw(){
echo mb_convert_encoding("日本語", 'UTF-8', array('EUC-JP', 'SHIFT-JIS', 'AUTO'));
}
draw();
?>

This works for me :)

like image 26
bayaraa Avatar answered Sep 21 '22 00:09

bayaraa