解决方案:
$output = '–– € ––';
//written like this php 5 does not understand because it interprets it as single-byte chars.
//so i found the function below to write a multi-byte char in a string.
//unicode version of php's chr()
function uchr ($codes) {
if (is_scalar($codes)) $codes= func_get_args();
$str= '';
foreach ($codes as $code) $str.= html_entity_decode('&#'.$code.';',ENT_NOQUOTES,'UTF-8');
return $str;
}
//decimal values of unicode chars: – 8211 - 8211, [space] 32, € 8364,[space] 32, – 8211 - 8211
$output = uchr(8211,8211,32,8364,32,8211,8211);
//or
$output = uchr(8211,8211).' '.uchr(8364).' '.uchr(8211,8211);
echo $output;
问题:
如何将这些特殊字符写入一个简单的文件?
$file = "./upload/myfile.txt";
$output = "–– € ––".PHP_EOL; // the "–" is not an underscore _ or - but –
file_put_contents($file, $output);
如果我从浏览器http://mydomain.com/upload/myfile.txt访问此文件,我只会收到“ ”字符。
然而,如果我用Zend Developer或我的本地短信(在OSX上)保存“ - € - ”并上传这一切都很好。浏览器正确显示它。
我如何用PHP实现这一目标?看来php使用的方式与我的macbook不同。以为我认为php的标准是UTF-8,我还在我的本地文本编辑器中将文件保存为UTF-8。
EXTRA INFO:在我写的上传文件夹中的.htaccess文件中:
AddDefaultCharset utf-8
AddCharset utf-8 .txt
否则firefox的firebug插件会显示未指定字符集的消息。
任何想法? 它与保存文件有关,因为我上传的文件显示正确。
我在保存文件时尝试了不同的选项:
$output = mb_convert_encoding($output, 'UTF-8', 'OLD-ENCODING');
和php的iconv功能,但我找不到解决方案。
非常感谢任何帮助。
编辑:如果我从我上传的文件中获取内容并回复它,则会发生以下情况
$output = file_get_contents('./upload/myuploadedfile.txt',FILE_USE_INCLUDE_PATH);
//it show correctly –– € ––
$output = $output[1]; //it shows a �
$output = $output[3]; //it shows a �
echo $output;
答案 0 :(得分:1)
PHP将完全按照源代码中的内容编写文件的内容。它完全取自在.php文件中编码的字节,并将它们放在一个文件中。从那时起,它取决于文件的解释方式。假设您的源代码实际上是UTF-8编码的,那么文件也是如此。尝试使用可以理解UTF-8的文本编辑器打开它。将浏览器解释的编码更改为UTF-8(查看菜单>编码)。当您在浏览器中打开它时,检查Web服务器是否实际设置了正确的字符集标题(Firebug网络选项卡,响应的标题)。
$output[0]
显示UTF-8字符损坏是正确的,因为PHP只为您提供多字节字符“ - ”的第一个字节。
有关更深入的信息,请参阅What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text。