我在做:
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
有什么方法可以解决这个问题吗?提前谢谢。
答案 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字符。
原始输入示例 作为图像,因为html页面未显示转义码:
使用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