php urlencod utf-8字符串可以在mb_detect_encoding

时间:2018-07-20 12:54:33

标签: php utf-8 get http-headers ascii

在更新某些旧项目的过程中,我通过一些旧的ANSI / ASCII文件和编码进行工作。 我想让所有程序都运行utf-8,以确保我可以支持各种语言。

我有一项服务,可以使用微服务发送短信。我有一个端点:/sms.php,我从_GET接受一些参数,然后在应用程序中使用这些参数。 我有一些测试文件,我在其中提出一些要求以测试一切是否正常。 我的问题是,即使所有文件都经过utf8编码(我已经检查了多次)

我的代码如下:

$text = "message with æøå to make it utf8";
$params = urlencode($text);
$url = "http://localhost/sms.php?text=".$params;
echo mb_detect_encoding($text, "auto"); // this prints utf8
echo mb_detect_encoding($url, "auto"); // this prints ascii
$res = file_get_contents($url);

这也是我在接收端点中看到的。

首先,我认为这与file_get_contents有关,但是由于在urlencode之后进行了转换,因此我以为是。但是我不确定如何解决这个问题。 我遇到的另一个问题是,很多客户都在使用此旧的2012年代码(在我开始将utf8用作标准之前),因此我无法更改端点而不会导致他们在当前设置中进行更改。

在评论中,我建议尝试使用以下命令检查字符串是否为utf8: bin2hex:

bin2hex($_GET['text']); // 6d657373616765207769746820c3a6c3b8c3a520746f206d616b652069742075746638 which is inserted into the database: message with æøå to make it utf8
bin2hex(utf8_decode($_GET['text'])); // 6d657373616765207769746820e6f8e520746f206d616b652069742075746638 which is inserted into the database: message with æøå to make it utf8

希望外面有人可以指出我正确的方向。 例如,我已经研究了多个stackoverflow条目 get utf8 urlencoded characters in another page using php What's the correct encoding of HTTP get request strings?

但是我不确定我在寻找什么甚至可能? 我只是希望能够将整个项目重写为utf8就绪

谢谢 /威尔

1 个答案:

答案 0 :(得分:0)

mb_detect_encoding为您提供测试字符串有效的第一个编码。如果留给自己的设备使用,它将在UTF-8之前测试ASCII。由于URL编码的字符串仅包含ASCII字符的子集,因此它是有效的ASCII,mb_detect_encoding会告诉您。包含非ASCII字符的字符串不是有效的ASCII,因此它将继续测试其他编码并最终到达UTF-8。

UTF-8是ASCII的超集,因此任何有效ASCII的字符串也是有效的UTF-8。一个字符串可以同时以多种编码形式有效; mb_detect_encoding告诉您它是有效的ASCII码, 不是 表示它 not 也是有效的UTF-8,Latin-1或众多其他编码。 Mojibake就是这样诞生的。

检测编码在很大程度上是模糊的废话,您绝对不应该这样做。如果您希望字符串使用UTF-8,只需测试一下它是否是有效的UTF-8:

mb_check_encoding($url, 'UTF-8')

如果在预期的编码中无效,则将其丢弃,因为您不知道它到底是什么。