诡异的 CP936 编码无法转换成 UTF-8

2018-12-12 14:34:47 +08:00
 alex321

Windows 服务器,MySQL 设置是 utf8_general_ci。存储中英文混合的 $url 字符串,比如 http://example.com/?str=001,中文

使用 mb_detect_encoding($url, array('ASCII', 'GB2312', 'GBK', 'UTF-8')) 得到编码是 CP936

使用 mb_convert_encoding($url, 'UTF-8', $encode) 无效。

Google 到 cnblog 上一个方法。

使用 iconv('UTF-8', 'latin1', $url)Detected an illegal character in input string

使用 iconv('UTF-8', 'latin1//IGNORE', $url) 执行后发现中文丢失。

以上各个过程中 print_r($url) 都是正常输出的。但将生成的 $url 在浏览器中,中文获取乱码。

目前完全卡住,求大佬们搭救,在线等。

6435 次点击
所在节点    PHP
7 条回复
nekoyaki
2018-12-12 14:39:48 +08:00
做个 urlencode 再往里存试试?
alex321
2018-12-12 14:49:51 +08:00
@nekoyaki #1 尝试过,不行。还是 CP936 编码。
nekoyaki
2018-12-12 15:12:02 +08:00
@alex321
做 urlencode 后,存进去的应该都是在 ASCII 字符范围内的啊,怎么会还是 CP936 呢
Jex
2018-12-12 15:24:22 +08:00
解决字符编码问题的方法很简单,不要看 print/console.log 之后的东西然后瞎猜,而是要直接看原始的 Binary,比如在 PHP 中用 bin2hex 再 print, 这样你就能知道原始的 Encoding 到底是什么,转换后的结果到底对不对。如果确认原始的 Encoding 无误,那么你就能肯定不是原始字符编码的问题,而是你输出环境的问题。

好吧,直接说结果吧,对于你这种情况,有可能就是输出的 HTML 页面设置的 Charset 不是 UTF-8。
zbinlin
2018-12-12 15:26:44 +08:00
@Jex 说得对,直接把 $url 的原始 binary ( hex 字符串或 base64 )贴出来吧
wxl1380610
2018-12-12 15:44:39 +08:00
这个是 gbk , 还有 , 存原始二进制
alex321
2018-12-12 15:46:27 +08:00
@nekoyaki #3 数据库的存取应该不影响。可能是 php 运行时调用了 windows 服务器系统 api 操作编码引起的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/516880

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX