PHP - 如何使用ANSI编码保存文本文件?

时间:2013-12-04 21:28:52

标签: php utf-8 ansi plaintext

我在做:

file_put_contents("txt/myfile.txt", $fileContents);

我尝试了很多方法强制我的文本文件为ANSI,如:

$fileContents = mb_convert_encoding($fileContents , mb_detect_encoding($fileContents , mb_detect_order(), true), 'WINDOWS-1252');

我也尝试过:

$fileContents = iconv("ISO-8859-1", "WINDOWS-1252", $fileContents );

我需要ANSI,因为当我使用MS-DOS中的“type”命令(Windows 7中的cmd.exe)打开它时,文本文件应该看起来不错

如果我打开当前文件,我可以看到UTF-8 BOM:

  

C:\ Users \ XXX>输入C:\ myfile.txt

     

'╗┐V01766699900000000000000005350005122013

如果我用Notepad ++打开文件并应用“转换为ANSI”,我得到(我需要的):

  

C:\ Users \ XXX>输入C:\ myfile.txt

     

V017666999 00000000000000005350005122013

有什么方法可以解决这个问题吗?提前谢谢。

3 个答案:

答案 0 :(得分:0)

如果PHP文件中包含非ASCII字符,则需要首先转换PHP文件的编码。

如果您的非ASCII字符来自某些外部来源,则需要对其进行iconv。但不是来自ISO-8859-1,而是来自外部源的编码。

答案 1 :(得分:0)

现在我知道发生了什么,该文件正在正确创建,但是我下载该文件时添加了不需要的BOM。

这是问题,我只需要更改一下:

/* Bad code */
header('Content-disposition: attachment; filename='.$_GET['filename']);
header('Content-type: application/txt');
readfile($_GET['filename']);

对此(下载为二进制文件,使其保持完整):

/* Good code */
header('Content-disposition: attachment; filename='.$_GET['filename']);
header('Content-type: application/txt');
header('Content-Transfer-Encoding: binary');
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate');
ob_clean();
flush();
readfile('txt/'.$_GET['filename']);

(最初是作为对问题的修改而发布的,但@Daniel建议发布答案以进行澄清)。

答案 2 :(得分:-1)

以下正则表达式将去除所有类型的ansii转义序列,包括颜色ansii rgb colors,光标移动,行跳转,以仅保留UTF-8字符。

从控制台获取的示例屏幕截图: enter image description here

原始输入示例 作为图像,因为html页面未显示转义码:

raw ansii

使用php将ANSII颜色剥离为原始UTF-8文本:

<?php    
$ansii = " |[0m [34m▓▓▓▓▓[0m |[0m[2m.[0m[34m▓▓▓  [0m[2m.[0m|[0m [34m ▓▓▓ [0m |[0m[2m.[0m[34m▓ ▓ ▓[0m[2m.[0m|[0m [34m  ▓  [0m |[0m[2m.[0m[34m ▓▓▓ [0m[2m.[0m|[0m [34m▓▓▓  [0m |[0m[2m.[0m[34m▓▓▓▓▓[0m[2m.[0m| [2m[37m♞ [ENGINES] ♘♘♘♘♘♘♘♘♘♘♘♘♘♘ ♞[0m";

echo preg_replace("/\x1B\[[0-9;]*[JKmsu]/","",$ansii);

/* OUTPUT ----*/
/* | ▓▓▓▓▓ |.▓▓▓  .|  ▓▓▓  |.▓ ▓ ▓.|   ▓   |. ▓▓▓ .| ▓▓▓   |.▓▓▓▓▓.| ♞ [ENGINES] ♘♘♘♘♘♘♘♘♘♘♘♘♘♘ ♞*/

甚至Linux命令行实用程序:iconv -f "ASCII" -t "UTF-8"都无法解析16bits rgb true colors ansii escape codes

这可以用来替换大多数-不包含核心的-php-mbstring软件包组件,因为例如php strlen()会返回正确的长度,为mb_strlen()

在线运行: https://3v4l.org/vRScD