【问题标题】:php urlencod utf-8 string makes it ascii in mb_detect_encodingphp urlencod utf-8 字符串使其成为 mb_detect_encoding 中的 ascii
【发布时间】:2018-12-28 19:03:20
【问题描述】:

在我更新一些旧项目的过程中,我正在处理一些旧的 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-ready

谢谢 /嗯

【问题讨论】:

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


    【解决方案1】:

    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')
    

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

    【讨论】:

    • 您好,感谢您的回复。对不起,我没有提到我很清楚可以订购检测,以便它以 utf8 而不是 ascii 开头,但是这样做并不能解释为什么在接收端我需要使 utf8_decode 能够将其读取为utf8 并将其正确插入数据库。 $_GET['text'] = utf8_decode($_GET['text']);
    • 那是完全不同的牛虫。 $_GET['text'] 可能是完美的 UTF-8,并且您在插入数据库时​​根本没有正确处理编码设置。使用echo bin2hex($_GET['text']) 查看您的字符串包含的字节,并检查它们是否代表您期望的字符的正确编码。
    • 我试过了,是的,该字符串看起来仍然包含 utf8 - 但随后将其插入 db 会使它再次消失?我知道这超出了这个问题的范围,但也许我可以稍微改变一下以适应
    • 您可能需要密切关注stackoverflow.com/a/279279/476
    • 就是这样。使用 set_charset 我也可以让它在数据库中工作。谢谢!
    猜你喜欢
    • 2013-04-24
    • 1970-01-01
    • 2015-08-06
    • 2013-11-17
    • 2012-06-25
    • 2017-06-10
    • 2016-05-31
    • 2021-12-31
    • 2012-10-29
    相关资源
    最近更新 更多