在php中写入带有特殊字符的文件

时间:2012-12-04 17:06:09

标签: php

解决方案:

    $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;

1 个答案:

答案 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