0

解决方案:

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

1 回答 1

1

PHP 将完全按照源代码中的内容写入文件的内容。它完全按照 .php 文件中编码的字节获取字节并将它们放入文件中。从那时起,这取决于文件的解释方式。假设您的源代码实际上是 UTF-8 编码的,那么文件也是如此。尝试使用可以理解 UTF-8 的文本编辑器打开它。将浏览器解释它的编码更改为 UTF-8(查看菜单 > 编码)。当您在浏览器中打开 Web 服务器时,检查 Web 服务器是否确实设置了正确的字符集标头(Firebug 网络选项卡,响应标头)。

显示损坏的 UTF-8 字符是正确$output[0]的,因为 PHP 只为您提供多字节字符“-”的第一个字节。

有关更深入的信息,请参阅每个程序员绝对、肯定需要了解的关于使用文本的编码和字符集的知识。

于 2012-12-04T19:25:14.443 回答