个性化阅读
专注于IT技术分析

如何在PHP中编写具有ANSI编码的文本文件(Western Windows-1252)

点击下载

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中, 你可以使用iconv函数来实现此目的, 尝试检测数据的编码(通常为UTF-8)并将其转换为新格式, 即Windows-1252(CP1252):

<?php

// Store your original text in some variable
$data = "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编码自动识别输出文件:

Windows 1252文字PHP

就是这样, 通常。如果文件内容没有特殊字符, 则文本编辑器可能会将其识别为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编码文件的内容, 你将在文本编辑器中看到奇怪的字符:

使用UTF-8打开的Windows1252(CP1252)文本

但是, 如果文本编辑器使用Windows-1252(CP1252)编码读取文件的内容, 则将正确读取文件:

Windows 1252(CP1252)以正确的编码打开

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在PHP中编写具有ANSI编码的文本文件(Western Windows-1252)

评论 抢沙发

评论前必须登录!