V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
nikoo
V2EX  ›  问与答

[面试难题] 中文站点用 GBK 编码代替 UTF-8 编码,可以节约多少储存/带宽成本?

  •  
  •   nikoo · 2018-06-09 11:53:55 +08:00 · 5124 次点击
    这是一个创建于 2359 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个中文站点,平均 HTML 页面源代码(包含 JS/CSS )的中文与英文比例为 9:1
    站点没有图片,所有流量皆为 HTML 页面流量

    目前使用的是 UTF-8 编码
    内容储存成本 1,000/月
    流量带宽成本 10,000/月

    那么请问如果将该站改为 GBK 编码,如何计算修改后其储 /带宽成本?

    求教各位,这个问题题库里从没见过,网上也搜不到答案,直接蒙圈了
    第 1 条附言  ·  2018-06-09 12:43:05 +08:00
    请不要考虑这个题是否符合现实情况,如:
    GBK/UTF-8 编码的优劣
    页面中英文比例 9:1 是否可能
    流量计算成本还要包括 TCP header 等等而不是纯 HTML 页面 size 的流量
    开启 Gzip 会让流量统计"差不多"
    开启数据库表压缩让储存成本"差不多"
    UTF-8 是变长编码忽大忽小所以没法算
    44 条回复    2018-06-10 00:37:06 +08:00
    haimall
        1
    haimall  
       2018-06-09 11:59:11 +08:00 via Android
    转了一大圈 是不是就是 gbk 与 utf-8 的编码区别?
    input2output
        2
    input2output  
       2018-06-09 12:00:53 +08:00   ❤️ 1
    中文一千字
    eslizn
        3
    eslizn  
       2018-06-09 12:01:30 +08:00   ❤️ 1
    死扣存储,讲道理 utf8 是变长,怎么算都算不准的,出这题人 sb
    sagaxu
        4
    sagaxu  
       2018-06-09 12:01:40 +08:00 via Android
    省下来的钱,还不够 cover 增加的开发成本
    lukefan
        5
    lukefan  
       2018-06-09 12:01:58 +08:00
    gzip 后忽略不计
    daigouspy
        6
    daigouspy  
       2018-06-09 12:04:03 +08:00 via Android
    @eslizn 网络传输还会 gzip 压缩,差别很小。
    nikoo
        7
    nikoo  
    OP
       2018-06-09 12:06:15 +08:00
    @input2output @haimall 用公式如何计算这个差别?

    @eslizn "utf8 是变长"?所以无法计算其差别吗?愿闻其详!

    @sagaxu 这只是一个面试题。。。

    @lukefan 未 gzip 呢?
    yidinghe
        8
    yidinghe  
       2018-06-09 12:08:37 +08:00
    楼主改为 GBK 编码之后,节省了存储空间,得到了表扬,很爽。终于到了某天发现存储内容包含了日文和韩文,于是想了个办法:将内容改为 URL 编码,自此噩梦开始了。
    smdbh
        9
    smdbh  
       2018-06-09 12:09:59 +08:00
    中英文比例 9:1,我是不信的
    momocraft
        10
    momocraft  
       2018-06-09 12:10:01 +08:00   ❤️ 1
    估算: 1 汉字在 GBK2 字节 在 UTF8 3 多一点字节

    但有这个也算不出成本...你甚至不知道收费是怎么算的 lol
    nikoo
        11
    nikoo  
    OP
       2018-06-09 12:14:11 +08:00   ❤️ 3
    @yidinghe @smdbh

    其实还可以喷世界上不会存在这种网站

    或者用 gbk 编码代替 utf-8 是多么可笑幼稚愚蠢的行为

    或者扣这几个字节却让网站失去了通用性是多么鸡贼的行为

    这只是一个面试题

    所以说遇到这个问题你的回答就是:没法回答,然后心里想:sb 公司出 sb 题目赶紧走人?
    congeec
        12
    congeec  
       2018-06-09 12:18:25 +08:00 via iPhone
    Http header
    TCP header
    Up header 也都算流量哦
    eslizn
        13
    eslizn  
       2018-06-09 12:19:12 +08:00
    @nikoo utf8 变长存储的,虽然 [一般] 汉字占用 3 个字节,但是不排除有超过的,所以无法预期输入内容的情况下,做不到精准计算
    nikoo
        14
    nikoo  
    OP
       2018-06-09 12:19:32 +08:00
    @momocraft 谢谢,有一点收获和思路了

    我知道这个情况不太符合现实,并且现实世界中流量成本计算方式也不是像题目里说的那么简单

    但这就像学数学计算一个水缸的水多久会流光,
    我不能在试卷上填写:“世界上没有这种水缸”
    或者:“这不就是计算水流动速度吗?”用一个问题回答另一个问题
    nikoo
        15
    nikoo  
    OP
       2018-06-09 12:20:47 +08:00
    @eslizn 谢谢,那不考虑变长,最粗略、平均、预估的计算方法有没有可能?
    zhujinliang
        16
    zhujinliang  
       2018-06-09 12:21:13 +08:00
    面试官问完了这个题,本想借此题发挥一下:你看,其实节省不了什么,所以不要做过度优化
    哪料程序员一拍桌子,sb 公司,老子不面了
    shyangs
        17
    shyangs  
       2018-06-09 12:23:14 +08:00   ❤️ 1
    数学计算不会去维护水缸,你会去维护网站,维护 GBK 网站准备被坑吧
    eslizn
        18
    eslizn  
       2018-06-09 12:24:23 +08:00
    @nikoo 本身差距就不大,“最(这个最理解不了)粗略、平均、预估”之后有何意义?
    nikoo
        19
    nikoo  
    OP
       2018-06-09 12:26:14 +08:00
    @shyangs 不能确定他们公司真打算改用 GBK 编码吧?这只是一个题目而已
    nikoo
        20
    nikoo  
    OP
       2018-06-09 12:27:29 +08:00
    @eslizn 谢谢,所以该题的答案就是写:“因为 UTF-8 是变长编码,所以差距不大” 如此?
    eslizn
        21
    eslizn  
       2018-06-09 12:28:58 +08:00
    @nikoo 看我第一条回复,金币不多,恕不奉陪
    rrfeng
        22
    rrfeng  
       2018-06-09 12:34:32 +08:00 via Android   ❤️ 1
    这玩意儿要算起来得一篇论文。
    Humorce
        23
    Humorce  
       2018-06-09 12:36:08 +08:00
    源代码中英文比例 9:1
    你打开一个小说页面看看有没有这么夸张。
    wdlth
        24
    wdlth  
       2018-06-09 12:37:52 +08:00
    这是一个多层次的问题,毕竟不只是页面文本是 UTF-8 的,数据库、缓存、RPC 等地方都得算进去。
    还有一个重要的点是 JSON,根据 RFC8259,在数据交换时 JSON 的文本数据必须使用 UTF-8 编码,用 GBK 编码有得玩。
    nikoo
        25
    nikoo  
    OP
       2018-06-09 12:44:44 +08:00
    @wdlth 问题的条件里说了流量全部为 HTML 页面,并没有 JSON
    3dwelcome
        26
    3dwelcome  
       2018-06-09 13:03:34 +08:00 via Android   ❤️ 1
    utf8 三字节,gbk 二字节。节约三分之一的磁盘空间。
    传输的话,都是压缩,基本没区别。
    nikoo
        27
    nikoo  
    OP
       2018-06-09 13:04:57 +08:00
    @3dwelcome 非常感谢!假设没有使用传输压缩的话,是否也是大约节约三分之一的流量成本?
    Foolt
        28
    Foolt  
       2018-06-09 14:37:45 +08:00
    什么垃圾问题,要是我遇到用 GBK 的公司,直接拒绝。
    si
        29
    si  
       2018-06-09 15:28:17 +08:00
    GBK 和 UTF8 的英文没区别,大致情况下 GBK 中文 2 字节和 UTF8 中文 3 字节。2:3 差别大概 1/3。
    中文与英文比例为 9:1。9 可以减少 1/3。相当于中文只要 6。6+1=7。
    不考虑其他情况,内容只有原来的 70%。
    nooper
        30
    nooper  
       2018-06-09 16:05:13 +08:00 via iPad
    题目出得挺 sb 的
    SoloCompany
        31
    SoloCompany  
       2018-06-09 19:17:18 +08:00   ❤️ 1
    UTF8 编码是 ascii 安全的,这是最重要的一点

    大多数亚洲字符集(当然包括 GB ),要么编码空间不足无法表示所有的 unicode,要么就是 ascii 不安全

    ascii 不安全,也就是说某些 ascii 特殊字符,比如 “<“, “>”, “&”, “/“, “%” 这些,都有可能被字符集为了增加那么一点微不足道的效率而用到了编码上

    这样所造成的后果,当你碰上了就知道有多麻烦了。
    BingoXuan
        32
    BingoXuan  
       2018-06-09 19:37:37 +08:00 via Android
    想起微信支付 api 报错返回中文是 GBK 编码的=_=
    chinvo
        33
    chinvo  
       2018-06-09 19:45:26 +08:00
    @congeec #12

    > Http header
    > TCP header
    > Up header 也都算流量哦

    自己实现一个协议和“浏览器”,把 TCP/IP 和 HTTP 里面的“无用”以及“保留”的字节全部清理掉

    每个网站都要装一个自己的协议驱动和浏览器,美滋滋

    [doge]
    Servo
        34
    Servo  
       2018-06-09 19:51:32 +08:00
    GB18030 最强(手动滑稽)
    sunsol
        35
    sunsol  
       2018-06-09 20:22:11 +08:00
    真正的问题是 html,js,css 如何能达到中英比例 9:1
    一般的情况下中文页面的中英比例基本是 1:9,
    就是小说页面中英比例最多也就 1:3,
    要想达到 9:1 这页面会是什么样子,没法想象啊。
    Mutoo
        36
    Mutoo  
       2018-06-09 21:52:04 +08:00
    换成 GBK 后,PM 说,我们想在文本里支持一下 emoji,233...
    lhx2008
        37
    lhx2008  
       2018-06-09 22:46:08 +08:00 via Android
    包含 css 和 js 怎么可能 9:1,1:9 还差不多,当他们是易语言吗。英文的话,UTF8 长度是一字节,所以,有啥意义?
    imn1
        38
    imn1  
       2018-06-09 23:37:08 +08:00   ❤️ 1
    汉字 /日语平假、片假 /朝鲜字符和主要标点符号都在 FFFF 以内,utf-8 对应是三字节
    部分汉字(主要是生辟字和异体字),extB/C/D 在 FFFF 以上,utf8 四字节,但这些汉字总数很少,甚少用到

    GBK 是双字节
    ASCII (0-127),utf-8/GBK 都是单字节
    ilylx2008
        39
    ilylx2008  
       2018-06-09 23:53:08 +08:00 via Android
    这题是考验你如何做取舍,正确答案是,为了一点点流量费,改为 gbk 是不科学的选择。
    di94sh
        40
    di94sh  
       2018-06-10 00:00:01 +08:00 via Android
    gbk 2 字节编码 utf-8 中文 3 字节
    nikoo
        41
    nikoo  
    OP
       2018-06-10 00:02:18 +08:00
    @imn1 UTF-8 编码是否存在 2 字节的汉字?还是说汉字均为 3-4 字节?
    mozutaba
        42
    mozutaba  
       2018-06-10 00:19:25 +08:00   ❤️ 1
    @nikoo
    占 2 个字节的:〇
    占 3 个字节的:基本等同于 GBK,含 21000 多个汉字
    占 4 个字节的:中日韩超大字符集里面的汉字,有 5 万多个
    nikoo
        43
    nikoo  
    OP
       2018-06-10 00:34:41 +08:00
    @mozutaba 谢谢,有没有常用的汉字占 2 字节的?还是仅这个 〇 是 2 字节?
    imn1
        44
    imn1  
       2018-06-10 00:37:06 +08:00   ❤️ 1
    @nikoo
    双字节的 utf-8 unicode 码为 80-07ff,这里面没有汉字
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2931 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:17 · PVG 16:17 · LAX 00:17 · JFK 03:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.