【问题标题】:End of line character for PHP-generated ASCII txt downloadPHP 生成的 ASCII txt 下载的行尾字符
【发布时间】:2012-06-08 12:21:58
【问题描述】:

我想对用户选择的 SQL 数据进行 ASCII 文本下载,可以立即在记事本中打开。数据库连接工作正常,启动下载的“标题”命令也能正常工作,但如果我能让行尾字符正确显示,我会被诅咒的。

标题是通过以下方式静态定义的:

$header = <<<EOD
  #Some header information
  #goes here on multiple
  #lines
  EOD;

每行数据都与制表符连接:

$RS_SQL = $DBinterface->dbGetRecordSet($someQuery);
foreach($RS_SQL as $row) {
  $rowdata = '';
  foreach($row as $key=>$val) {
    if((!(int)$key) && $key!='0') {
      $rowdata[] = $row[$key];
    }
  }
  $dataOutput.=implode("\t",$rowdata)."\n";
}
header("Content-type: text/plain; charset=ISO-8859-1");
header("Content-Disposition: attachment; filename=SQLDataExport.txt");
echo $header."\n".$dataOutput;

标题在记事本中显示得很好,并且所有制表符间距都完全按照设计...但是,任何通过 \r 或 \n 字符很好地格式化行的尝试都会导致单行包含未知字符(方框),其中换行应该是。

我尝试将文件写入服务器,然后读取流并输出;尝试了标头信息的变体...有点明白通过二进制将页面下载到浏览器的方式有些奇怪,但是?

我错过了什么?

非常感谢。

【问题讨论】:

  • 与您的方框问题无关,但记事本需要\r\n 而不仅仅是\n 否则它将忽略换行符。

标签: php html download http-headers ascii


【解决方案1】:

不要使用“\n”或“\r\n”,而是使用PHP_EOL。它可以处理任何跨平台问题,并且非常适合编写要保存在服务器或客户端上的文件。

This question 有一些信息,可能被认为与您正在尝试做的事情有关。

你会这样使用它:

$RS_SQL = $DBinterface->dbGetRecordSet($someQuery);
foreach($RS_SQL as $row) {
  $rowdata = '';
  foreach($row as $key=>$val) {
    if((!(int)$key) && $key!='0') {
      $rowdata[] = $row[$key];
    }
  }
  $dataOutput.=implode("\t",$rowdata).PHP_EOL;
}
header("Content-type: text/plain; charset=ISO-8859-1");
header("Content-Disposition: attachment; filename=SQLDataExport.txt");
echo $header."\n".$dataOutput;

【讨论】:

  • 谢谢 - 效果很好。我将把我所有的结局都换成那个常数。不过有趣的是,这不是跨平台问题... Windows Server 上的 IIS 通过 IE 与 Windows 记事本对话。
  • 非常好。随意接受答案,以便其他人知道这对您有用!
【解决方案2】:

尝试将其添加到header 为UTF-8:

header("Content-type: text/plain; charset=utf-8");

希望对您有所帮助! :) 如果没有,请检查您的 PHP 代码是否有任何 UTF-8 BOM

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    相关资源
    最近更新 更多