utf8_encode 不对特殊字符 ě/š/č/ř/ž/ý/á 等进行编码

utf8_encode does not encode special characters ě/š/č/ř/ž/ý/á, etc

我有以下问题似乎没有解决方案,我非常反感。

我有 Android 应用程序,用户可以在其中将文件上传到我的服务器,然后他们就可以访问这些文件。因此,如果用户打开他的帐户,此应用程序将使用函数 scandir() 并且在我的服务器上我使用方法 json_encode() 将数据发送到我的应用程序以向他显示他的文件和文件夹。 问题来了:

例如,如果某些用户上传了带有特殊字符的文件 (Válcování stupHovitých vzorko za tepla.pptx) 并且此文件不是 utf-8 编码的,那么我可以'不要通过 json_encode 传递它,因为我收到 UTF-8 错误。所以我尝试在每个文件名上使用方法 uf8_encode() 并且它有效,BUT 如果有一些文件或文件夹带有特殊字符,如 č/š/ ě/ř/ž/á/ý/í/é 等 并在其上使用方法 utf8_encode() 然后我的应用程序变得有些混乱,而不是获取名称为 č 的文件夹,我得到姓名 Ä.

我几乎尝试了从 htmlspecialchars()iconv() 的所有方法,但我找不到一种方法 returns 我的服务器上的文件和文件夹具有适当的名称。

是的,不是。 The doc 读取:

utf8_encode — Encodes an ISO-8859-1 string to UTF-8

不确定它是什么编码,但绝对不是 ISO-8859-1

您需要使用mb-convert-encoding在任意编码之间进行转换。例如

$utfStr = mb-convert-encoding('č/š/ě/ř/ž/á/ý/í/é', 'UTF-8', 'ISO-8859-15')

如果您不知道客户端的编码,您可能需要使用 mb_detect_encoding,这可能并不总是有效,或者并不完全准确。

为了避免这种混乱,我建议换一种方式,从您的 android 应用发送 utf 编码的文件名,而不是在服务器端进行转换。