PHP上传文本文件编码检查和操作


PHP upload text file encoding check and manipulation

我有一个标准的文件上传,用户应该上传一个文本文件。但"文本文件"并不等同于"文字文件"。同一个文件可以有不同的编码:UTF8、UTF7、UTF16、UTF32、ASCII和ANSI

为了更清楚,我注意到有些编码不能显示所有字符,另一种编码可以显示。

树问题:

  • witch编码是"最具竞争力"的一种,在这里您可以将任何编码转换为而不会丢失内容

  • 检查该文件是否为文本文件而非二进制

  • 检查文本文件的内容是否为base64编码?

  • 如果上传的编码不是"最具竞争力",则将"动态"编码更改为"最具竞争性"编码(参见问题1)

我不想在这里发送整个代码,所以让我们承认我有表单和action="upload.php",现在是我需要检查以上内容的部分。

$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
[...]
// this ist the check after the upload
if(isset($_POST["submit"])) {
     // check 1 : what encoding has been uploaded ?
     // check 2 : is the file a text file and not a binary?
     // check 3 : in the content of the file a base64 encoded text?
}
// if the encoding is different to the "most preferred" change the encoding to the "most preferred"
[...]

你能帮忙吗?

witch编码是"最具竞争力"的一种,在这里您可以将任何编码转换为而不会丢失内容

Unicode。选择Unicode标准的任何常见编码,如UTF-8或UTF-16。互联网上事实上的标准是UTF-8。

检查该文件是否为文本文件而非二进制

没有这样的区别。文本文件也只包含二进制数据,碰巧这种二进制数据以正确的编码解释会产生人类可读的文本。

您可以尝试检查文件是否包含大量"控制字符"或NUL字节等,然后它可能不是文本

您可以尝试确认文件在任何预期编码中是否有效。手头有一份支持/预期编码的列表,并对照该列表进行检查。请注意,任何随机二进制垃圾在任何单字节编码中都是"有效的",如ISO-8859-1…

检查文本文件的内容是否为base64编码?

尝试将其解码为Base64。如果它解码正确,那么它可能是Base64编码的。如果由于错误/格式错误的字符而无法解码,那么它可能不是。然而,这很容易产生误报,因为简单的短文本序列可能看起来像Base64编码的文本。

如果上传的编码不是"最具竞争力",则将"动态"编码更改为"最具竞争性"编码(参见问题1)

如果它不是UTF-8编码的,请将其从原始编码转换为UTF-8。。。

你怎么知道它的原始编码?你没有。您可以猜测。同样,手头有一份编码列表,并使用最有可能的编码逐一核对。

你觉得这听起来不太理智?那是因为事实并非如此。

试图处理未知编码是一场噩梦,你最好尽量避免

没有正确的答案。会出现误报。如果没有人工确认结果,您就无法确定。如果你有一个未知编码的文本文件,试着用所有已知的编码来解释它,排除那些无法正确解码的编码,让人来选择最好的结果。有些库实现了这种猜测/检测逻辑,可能与统计文本分析相结合,以猜测解码文本是实际文本的可能性,但请注意,所有这些库从根本上只能为您提供最佳猜测

或者知道编码是从什么开始的。通过元数据,或者让人告诉你。

另请参阅每个程序员绝对、积极地需要了解的关于使用文本的编码和字符集的信息。