解决方案:
$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。
额外信息:在上传文件夹中的 .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;