【问题标题】:Write a file with encoding UTF-8 in php在php中编写一个编码为UTF-8的文件
【发布时间】:2011-10-01 13:08:21
【问题描述】:

PS:这不是一个重复的问题,因为我不想在文件中写入内容,因为它已经完成了,我想将文件的类型更改为 UTF-8,是有区别的。

如何生成 UTF-8 文件而不是 ANSI。 (不是内容)。

例如,大多数 IDE 都有一个选项编码,您可以在其中修改文件的类型,但我从我的数据库中生成一个批量,它会生成很多单独的文本文件,但整个files 是 ANSI 默认值。我只是在 php 中寻找一个函数,它可以在生成批量之前更改编码。

如果源代码有帮助,我可以在这里发布。请告诉我。

提前致谢。

已编辑

按照我在这里的要求进行打印。

当我生成文件“testecli01.csv”时,它总是得到编码 ANSI,无论我在我的脚本中做什么,它总是 ANSI,我需要 UTF-8,就是这个。很简单,但我不知道该怎么做。

【问题讨论】:

  • 除了您是从数据库生成文件之外,How to write file in UTF-8 format? 的问题与您的问题非常匹配。改变文件的编码没有神奇的调用,你必须读取它,改变编码,然后再写回来。
  • 以上评论说得对。没有神奇的数据库编码转换免费午餐。
  • 不是同一个问题,它是关于文件本身而不是文件的内容。是一件让我感到害怕的事情.. 没有好的资源,甚至 php 文档本身.. 我可以手动完成,但我有数千个文件... 0_o
  • @Fernando,文本文件没有“编码”属性。对于 UTF-8,与此最接近的是文件开头的 BOM 标记。但即便如此,您仍然必须将文件的内容转换为 UTF-8:只输入 BOM 并不能解决任何问题,除非您的文件中没有特殊字符,其中如果它们是有效的 UTF-8 开头。
  • notebad++ 在转换文件编码方面对我很有帮助。免费下载

标签: php utf-8


【解决方案1】:

如果您在评论中提到的第 3 方程序“不支持 ANSI 文件,但支持 UTF-8”,那么它很可能需要 BOM

虽然 Unicode 标准确实允许 UTF-8 格式的 BOM,[2] 但它不允许 要求或推荐它。 [3]字节顺序在 UTF-8[4] 中没有意义,所以 BOM 仅用于将文本流或文件标识为 UTF-8。

原因 建议反对的 BOM 是它打败了 ASCII 向后兼容,这是 UTF-8 设计的一部分。

严格来说,您的第 3 方程序并不完全符合标准,因为 BOM 应该是可选的。 ANSI 是 100% 有效的 UTF-8,这是它的主要驱动力之一。任何可以根据定义理解标准的 UTF-8 的东西也可以理解 ANSI。

尝试在文件前面写"\xEF\xBB\xBF",看看是否能解决您的问题。

【讨论】:

  • 第3方程序来自gov,是一个很老的程序,不允许ascent,那么你可以想象什么类型的程序......无所谓,因为我生成数据。我认为 ANSI 是正确的,因为它具有所有 ascent,并且数据还可以,但是 gov 程序不接受 ascent,也许我从我的数据库中删除了所有 ascent.. ahahaha 无论如何谢谢,BOM 我不知道它。
【解决方案2】:

我不知道有哪个数据库可以轻松地为您进行编码转换。例如,在 MySQL 中,您必须重置 db、表和列的所有字符编码,然后转换数据。

我建议您创建数据库转储并使用iconv 更改编码,无论是在命令行上:

iconv -f original_charset -t utf-8 dumpTextData > convertedTextData

或在 PHP 中(取自 How to write file in UTF-8 format?

$input = fopen($file, 'r');
$output = fopen($file, 'w');
stream_filter_append($input, 'convert.iconv.UTF-8/OLD-ENCODING');
stream_copy_to_stream($input, $output);
fclose($input);
fclose($output);

注意:已编辑以避免泄漏文件描述符。

【讨论】:

  • 您复制的答案泄露了文件描述符。如果您有超过几百个文件,这将导致问题。
  • @zneak 感谢您指出这一点。我忘记了你不能相信别人知道你需要fclose。编辑包括在内。
  • 您仍在从fopen 泄漏stream_copy_to_stream 中的文件描述符。 :) 我已经为你修好了。
  • ...我需要记住如何阅读哈哈。我去编辑,但你打败了我。谢谢。
  • @Zneak 实际上它有数千个而不是数百个文件,它没有完全使用,但我希望在生产环境中使用.. 问题是会导入数千个 .txt 文件由 3td 方程序,它不支持 ANSI 但 UTF-8 的文件。那么txt文件需要是这样的..
【解决方案3】:

Excel 喜欢 CSV 文件为 UTF-16LE,并以“\xFF\xFE”开头。

我为 excel 构建文件的代码是:

echo "\xFF\xFE"; // marker for UTF-16 file;

foreach ($rows as $row)
    echo mb_convert_encoding($row, 'UTF-16LE');

【讨论】:

    【解决方案4】:

    旧编码优先,因为它在 iconv 函数中。 你也不能读写同一个文件。

        $input = fopen($path, 'r');
        $output = fopen($path . '.tmp', 'w');
        stream_filter_append($input, 'convert.iconv.OLDENCODING/UTF-8');
        stream_copy_to_stream($input, $output);
        fclose($input);
        fclose($output);
        unlink($path);
        rename($path . '.tmp', $path);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-18
      • 2011-06-30
      • 2014-09-11
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      相关资源
      最近更新 更多