PHP的fwrite函数或file_put_content并不关心文件的元数据, 它只是将给定的数据写入存储中, 仅此而已。这导致一个简单的推测, 文本文件的字符集由其数据定义, 因此你需要将要写入文件的数据转换为特定格式。
在某些企业中, 此过程是必需的, 因为其他大公司的软件已过时并且不能使用UTF-8默认编码正常运行, 因此你需要将生成的文件的编码强制更改为命名为”
ANSI”
编纂。当将术语”
ANSI”
应用于Microsoft的8位代码页时, 使用的是错误的称呼。它们基于为ANSI标准化提交的草案, 但是ANSI本身从未对其进行标准化。 Windows-1252(最常称为”
ANSI”
的代码页)与ISO 8859-1(Latin-1)相似, 不同之处在于Windows-1252的可打印字符范围为0x80..0x9F, 其中ISO 8859-1在该范围内具有控制字符。 Unicode在该范围内也具有控制字符。
【如何在PHP中编写具有ANSI编码的文本文件(Western Windows-1252)】在PHP中, 你可以使用iconv函数来实现此目的, 尝试检测数据的编码(通常为UTF-8)并将其转换为新格式, 即Windows-1252(CP1252):
<
?php// Store your original text in some variable$data = "http://www.srcmini.com/Los se?ores del pueblo de alli comen sopa con cucharas.";
// Change the encoding of the file using iconv$string_encoded = iconv( mb_detect_encoding( $data ), 'Windows-1252//TRANSLIT', $data );
// Write File$file = fopen("my_text_file.txt", "w+");
fwrite($file, $string_encoded);
fclose($file);
你喜欢的文本编辑器将使用Windows-1252编码自动识别输出文件:
文章图片
就是这样, 通常。如果文件内容没有特殊字符, 则文本编辑器可能会将其识别为UTF-8, 因此你唯一的选择是使用CLI工具来转换文件的编码(请阅读下一段) 。
如果文件仍然没有正确的编码 如果在使用纯PHP手动在文件上写入内容之后, 未在文件内容中使用所需的编码, 则可能需要使用系统级方法来设置文件的编码。
使用CLI的首选和最简单的方法是使用iconv。此CLI工具将输入文件中字符的编码从一种编码字符集转换为另一种。除非通过– output选项或带有cli的简单输出重定向另外指定, 否则结果将写入标准输出, 例如:
iconv -t CP1252 -f UTF-8 "input_file.txt" >
"encoded_output_file.txt"
你可以使用PHP的exec函数以上述参数运行iconv程序, 该参数在每个基于UNIX的操作系统或Windows(使用Cygwin)中均可用。
如前所述, 大多数使用自动编码检测器的文本编辑器都会根据内容来决定使用哪种编码, 因此通常, 尽管使用Windows-1252编码(CP1252)和UTF-8使用PHP存储在文件中的字符串模式将被使用。这意味着基于内容的编码检测仅基于启发式, 因此不能保证用于打开文件的编码正确。
但是, 内容并不存在, 因此, 如果你尝试使用UTF-8编码打开Windows-1252编码文件的内容, 你将在文本编辑器中看到奇怪的字符:
文章图片
但是, 如果文本编辑器使用Windows-1252(CP1252)编码读取文件的内容, 则将正确读取文件:
文章图片
编码愉快!
推荐阅读
- 如何在Symfony 3中使用Doctrine执行纯SQL
- Unirest PHP SSL证书问题(无法获取本地颁发者证书)
- Crud可捕获的致命错误(Entity\MyClass类的对象无法转换为字符串Symfony 3)
- 在Symfony 2和3中实现Disqus评论
- 如何使用Potrace CLI对图片中的签名进行数字化和矢量化
- 如何在Linux和Windows环境中使用PHP执行Shell命令而无需等待结果(异步)
- 如何在没有Imagick的情况下在PHP中调整图像大小并降低质量
- 如何在CSS中使用超赞的字体如医学图标
- 从zip安装android studio时,Windows 10上没有SDK