首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  PHP

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

  •  
  •   alex321 · 68 天前 · 724 次点击
    这是一个创建于 68 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 在浏览器中,中文获取乱码。

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

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

    好吧,直接说结果吧,对于你这种情况,有可能就是输出的 HTML 页面设置的 Charset 不是 UTF-8。
        5
    zbinlin   68 天前   ♥ 1
    @Jex 说得对,直接把 $url 的原始 binary ( hex 字符串或 base64 )贴出来吧
        6
    wxl1380610   68 天前   ♥ 1
    这个是 gbk , 还有 , 存原始二进制
        7
    alex321   68 天前
    @nekoyaki #3 数据库的存取应该不影响。可能是 php 运行时调用了 windows 服务器系统 api 操作编码引起的。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3812 人在线   最高记录 4346   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 16ms · UTC 01:31 · PVG 09:31 · LAX 17:31 · JFK 20:31
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1