我有一个允许上传各种文本(子)的测试项目,然后显示这些文本文件的内容。当使用的字符不是字母时会出现问题,即像ŠŽČĆ这样的变音符号中的西里尔字母。文本文件中的字符可以预先上传,但是当我在服务器上打开上传的文件时,所有字符ŠŽČĆĐ都被替换为 . 是的,你没看错,它是一个长方形的东西。
我使用这条线路,它在 localhost 上运行良好,但在共享主机上却很合适。
$temp = iconv(mb_detect_encoding($tmp, mb_detect_order(), true), "UTF-8", utf8_encode($tmp));
其中$temp
variable 是要解码的字符串。它是托管的东西,我可以做些什么来防止它吗?
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 十六进制代码。如果有人知道如何重新创建能够区分这些矩形并显示正确的十六进制代码或字符本身的函数,或者如何在不允许它更改文本文件中的字母编码的情况下上传到共享主机,或者如何解决整个问题,它将不胜感激。
互换的青春