为了账号安全,请及时绑定邮箱和手机立即绑定

文本文件中的工件

文本文件中的工件

PHP
收到一只叮咚 2022-07-16 11:06:18
我有一个允许上传各种文本(子)的测试项目,然后显示这些文本文件的内容。当使用的字符不是字母时会出现问题,即像ŠŽČĆ这样的变音符号中的西里尔字母。文本文件中的字符可以预先上传,但是当我在服务器上打开上传的文件时,所有字符ŠŽČĆĐ都被替换为 . 是的,你没看错,它是一个长方形的东西。我使用这条线路,它在 localhost 上运行良好,但在共享主机上却很合适。$temp = iconv(mb_detect_encoding($tmp, mb_detect_order(), true), "UTF-8", utf8_encode($tmp));其中$tempvariable 是要解码的字符串。它是托管的东西,我可以做些什么来防止它吗?PS:如果我不使用utf8_encode变量$tmp,服务器会抛出错误。编辑1:第一张图片显示了在共享主机上打开文件时的外观。 当我复制/粘贴那个东西时,它看起来像这样 遗憾的是它没有在 SO 上呈现。还是走运,看你怎么看……上面这句话是图片,不是打出来的字符。然而,当您在 SO 上发帖时,我输入的文本和上传文件中的字符被复制然后粘贴。编辑2:我整理了一下,找出了问题所在。文件正确保存为 utf8,其中包含先前所说的字母。当文件上传时,这些字母会变成矩形。因此,当我在服务器上打开文件时,而不是ŠŽČĆĐ,我得到矩形。如何防止服务器更改任何内容并按原样上传?所以这不是格式化的东西,通过将编码设置为 utf8 似乎有助于至少显示它,如果我没有将编码设置为 utf8,它会引发错误。我使用 Laravel 作为后端。编辑3:如果我用这个从文件中读取后测试特定的字符mb_convert_encoding(file($path)[8][9])//It should be **š** character它显示它是 utf8,但如果是它将显示。如果我尝试这条线:mb_convert_encoding(file($path)[8][9], "UTF-8", "ISO-8859-1")然后它在服务器上的文件中显示矩形的东西。如果我使用附加参数来检测编码,例如:mb_detect_encoding(file($path)[8], "UTF-8", TRUE);要确定它是否是实际的 utf8,它说它是错误的。如果我将矩形的东西粘贴到谷歌翻译中,它会显示一个“š”。这是正确的字母。如果我bin2hex()用来查看十六进制代码,例如参数是š字母,我会得到 9a 十六进制代码。如果有人知道如何重新创建能够区分这些矩形并显示正确的十六进制代码或字符本身的函数,或者如何在不允许它更改文本文件中的字母编码的情况下上传到共享主机,或者如何解决整个问题,它将不胜感激。
查看完整描述

1 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

不要使用 utf8 编码。它仅适用于从 ISO-8859-1 转换,不适用于 Windows-1252。

https://www.php.net/manual/en/function.utf8-encode.php


第二个问题是您的代码进行了双重编码。我标记了两个将字符串转换为 UTF-8 的函数。


$temp = iconv(mb_detect_encoding($tmp, mb_detect_order(), true), "UTF-8", utf8_encode($tmp));

/*      ^^^^^                                                             ^^^^^^^^^^^      */

如果下面的代码不起作用,我将调试mb_detect_encoding($tmp, mb_detect_order(), true). 的默认值mb_detect_order()可能远不适合您的情况。

https://www.php.net/manual/en/function.mb-detect-encoding.php

https://www.php.net/manual/en/function.mb-detect-order.php


$temp = iconv(mb_detect_encoding($tmp, mb_detect_order(), true), "UTF-8", $tmp);

您可以使用mb_convert_encoding(). https://www.php.net/manual/en/function.mb-convert-encoding.phpiconv


对于您的问题,我将编写以下代码:


/* If there are no Asian languages, the UTF-8 is the only encoding the mb_detect_encoding can recognize. */

if (mb_detect_encoding($tmp, 'UTF-8')) {

    $temp = $tmp;

} else {

    /* It is not UTF-8. Assume WINDOWS-1252. */

    $temp = mb_convert_encoding($tmp, 'UTF-8', 'WINDOWS-1252');

}

很难可靠地检测到特定的单字节编码。我不知道任何为此构建的 PHP 函数。


查看完整回答
反对 回复 2022-07-16
  • 1 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信