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

python3 http.server 作为小文件服务器时,通过 url 访问文件遇到中文乱码怎么处理?

  •  
  •   css3 · 2021-04-07 12:27:01 +08:00 · 3377 次点击
    这是一个创建于 1107 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目录下有一堆 txt 文件,里边有中文,通过 python3 http.server 创建的文件服务器,通过 url 打开 txt里边中文全是乱码,有什么办法解决吗,stackoverflow 找了个答案,尝试 charset=utf-8 也无济于事

    24 条回复    2021-04-08 09:32:00 +08:00
    ericls
        1
    ericls  
       2021-04-07 12:31:24 +08:00 via iPhone   ❤️ 1
    这个需要浏览器处理吧……
    ericls
        2
    ericls  
       2021-04-07 12:32:06 +08:00 via iPhone
    我估计那些文件本来就不是 utf8 的
    ungrown
        3
    ungrown  
       2021-04-07 12:38:34 +08:00
    同意楼上看法,这个问题没有可以完美解决的银子弹的,编码这个东西就算尝试去推测也依然会有例外,要么统一编码,要么想办法在文件里注明编码,要么就在浏览器端改解码方式
    css3
        4
    css3  
    OP
       2021-04-07 12:39:51 +08:00 via iPhone
    @ericls 是 utf-8
    css3
        5
    css3  
    OP
       2021-04-07 12:40:03 +08:00 via iPhone
    @ungrown 浏览器怎么改
    crab
        6
    crab  
       2021-04-07 12:41:24 +08:00
    浏览器自动识别的啊。测试了你说的这个情况正常。
    cz5424
        7
    cz5424  
       2021-04-07 12:43:32 +08:00 via iPhone
    Win 下指定 gbk 看看
    ahhui
        8
    ahhui  
       2021-04-07 12:44:39 +08:00
    你需要设置的不是 http 的 charset 头,而是设置 content-type,给你的 content-type 增加下面一整行(注意别当两个 head 字段处理):
    Content-Type:text/plain; charset=utf-8
    lujjjh
        9
    lujjjh  
       2021-04-07 12:50:18 +08:00   ❤️ 2
    方法 1
    python3 -c "from http.server import SimpleHTTPRequestHandler as H, test; H.extensions_map['.txt'] = 'text/plain; charset=UTF-8'; test(H)"

    方法 2
    Chrome / Edge 安装 https://chrome.google.com/webstore/detail/set-character-encoding/bpojelgakakmcfmjfilgdlmhefphglae 插件,手动设置成 UTF-8
    css3
        10
    css3  
    OP
       2021-04-07 14:11:17 +08:00
    @ahhui 方法一无效,方法 2 还未尝试
    css3
        11
    css3  
    OP
       2021-04-07 14:11:37 +08:00
    @lujjjh 方法一无效,方法 2 还未尝试
    xcstream
        12
    xcstream  
       2021-04-07 14:19:17 +08:00
    浏览器不适合直接打开 txt
    用 html 比较合适
    lujjjh
        13
    lujjjh  
       2021-04-07 14:20:11 +08:00
    @css3 方法 1 无效大概率是被你的浏览器缓存了,Python 的 http server 支持 If-Modified-Since
    css3
        14
    css3  
    OP
       2021-04-07 14:22:33 +08:00
    @lujjjh

    @ahhui 我看了一下好像没有生效呐,response_headers 里边的 Content-Type: text/plain 还是默认值
    css3
        15
    css3  
    OP
       2021-04-07 14:23:16 +08:00
    @lujjjh 我也认为是缓冲,还特意在无痕模式下验证了一下
    turan12
        16
    turan12  
       2021-04-07 14:23:30 +08:00 via iPhone
    header 加个 attachment,把文件做附件下载
    css3
        17
    css3  
    OP
       2021-04-07 14:26:08 +08:00
    @turan12 就是要在线预览
    waytoexplorewhat
        18
    waytoexplorewhat  
       2021-04-07 14:47:44 +08:00
    我的做法是自己开一个项目,然后在返回 txt 的时候指定编码格式,总共也没有多少行代码
    ch2
        19
    ch2  
       2021-04-07 14:54:20 +08:00 via iPhone
    多了解一下 http 协议跟浏览器机制吧,你得告诉浏览器它是个啥玩意,要不然信息量不足,它就按默认的方式处理,当然是乱码的
    love
        20
    love  
       2021-04-07 14:57:06 +08:00
    python -m http.server 就别用了,这就是个玩具,有一大堆正经的同类开源软件不好吗
    node 版的同类玩具 serve 都比这货好 10 倍
    SenLief
        21
    SenLief  
       2021-04-08 07:55:48 +08:00 via Android
    http.server 是用来下来的,不是用来查看的。
    css3
        22
    css3  
    OP
       2021-04-08 09:15:06 +08:00
    @SenLief 小文件看下还是可以的,挺方便
    FaiChou
        23
    FaiChou  
       2021-04-08 09:29:33 +08:00
    https://s3.us-west-2.amazonaws.com/secure.notion-static.com/1224dc44-4b73-4528-8b87-e3ef1649f670/default_king_select.conf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAT73L2G45O3KS52Y5%2F20210408%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20210408T012431Z&X-Amz-Expires=86400&X-Amz-Signature=4b2dbe306940581303ca8becc02f8d4ceeeaa3c8826c538e87a04831134c4510&X-Amz-SignedHeaders=host&response-content-disposition=filename%20%3D%22default_king_select.conf%22

    你可以试试上面这个链接, 打开是不是乱码. 我手机和电脑都是英文系统, 所以手机和电脑打开都是中文乱码的.

    在电脑 Chrome 装 Set Character Encoding 这个插件, 选上默认 utf-8 可以解决乱码.

    在电脑 Safari 中, Preferences - Advanced - Default encoding - UTF-8, 可以解决乱码.

    浏览器客户端自己可以解决. 我查看了一下 Chrome 这个插件, 会将请求的 `response header Content-Type: text/plain` 添加一个 `charset=utf-8` 所以浏览器正常解析了.
    css3
        24
    css3  
    OP
       2021-04-08 09:32:00 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5436 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:14 · PVG 15:14 · LAX 00:14 · JFK 03:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.