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

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

  •  
  •   alex321 · 2018-12-12 14:34:47 +08:00 · 6529 次点击
    这是一个创建于 2174 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    好吧,直接说结果吧,对于你这种情况,有可能就是输出的 HTML 页面设置的 Charset 不是 UTF-8。
    zbinlin
        5
    zbinlin  
       2018-12-12 15:26:44 +08:00   ❤️ 1
    @Jex 说得对,直接把 $url 的原始 binary ( hex 字符串或 base64 )贴出来吧
    wxl1380610
        6
    wxl1380610  
       2018-12-12 15:44:39 +08:00   ❤️ 1
    这个是 gbk , 还有 , 存原始二进制
    alex321
        7
    alex321  
    OP
       2018-12-12 15:46:27 +08:00
    @nekoyaki #3 数据库的存取应该不影响。可能是 php 运行时调用了 windows 服务器系统 api 操作编码引起的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   902 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:09 · PVG 04:09 · LAX 12:09 · JFK 15:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.