Java Javascript 内部字符基于什么原因采用 UTF16 编码,而不是 UTF8? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
xia0ta0
V2EX    程序员

Java Javascript 内部字符基于什么原因采用 UTF16 编码,而不是 UTF8?

  •  
  •   xia0ta0 2014-07-08 09:12:37 +08:00 5989 次点击
    这是一个创建于 4115 天前的主题,其中的信息可能已经有所发展或是发生改变。
    为了兼容之前的USC2,还是UTF16在效率或者内存占用方面确实有优势?
    9 条回复    2014-07-09 00:52:52 +08:00
    est
        1
    est  
       2014-07-08 09:19:30 +08:00 via Android
    utf16的确有效率优势。等宽的。

    最根本原因是标准已经写死了
    sujin190
        2
    sujin190  
       2014-07-08 09:24:52 +08:00
    明显utf-16都是双字节的,在内存方面应该更简单吧
    imn1
        3
    imn1  
       2014-07-08 09:45:01 +08:00
    UTF-16不是双字节吧?
    xia0ta0
        4
    xia0ta0  
    OP
       2014-07-08 09:50:59 +08:00
    utf-16同样存在需要4字节的情况,虽然这种情况比utf-8要少。

    在计算字符串长度、查找及正则匹配的时候,都需要解码。转码效率会有很大差异吗?

    标准委员会主要考虑的因素是不是utf-16的例外要比utf-8少,语言实现起来效率会更好?
    VYSE
        5
    VYSE  
       2014-07-08 11:11:55 +08:00
    因为iterate utf8必须一个字符一个字符的挪,utf16直接算偏移即可。
    s51431980
        6
    s51431980  
       2014-07-08 11:20:00 +08:00
    如果没记错,java是utf-16的,不知道是不是为了java,当初网景和sun是合作者来的
    reus
        7
    reus  
       2014-07-08 15:36:44 +08:00   1
    utf16是变长编码,有4字节的。定长的是ucs2
    xia0ta0
        8
    xia0ta0  
    OP
       2014-07-08 16:41:42 +08:00   1
    果然是历史原因,哈哈!

    看C#: http://blog.coverity.com/2014/04/09/why-utf-16

    stackoverflow的回答: http://stackoverflow.com/questions/5292150/whats-the-point-of-utf-16

    C#是因为VB用的是BSTR(带长度前缀的UCS-2?),Java诞生的时候只有UCS-2可选。
    为了兼容,采用了超集UTF16,而不是不兼容的UTF8。

    值得注意的是,C#忽略了UTF16 4字节的问题,如果字符串含有编码为4字节的字符,获取长度等会有问题。C#的开发者在第一个链接里提到了。。。。

    个人猜测C#这么做的原因可能是 如果考虑到4字节,对字符串操作必须先编解码,程序的效率影响会比较大。

    看了一下Erlang的文档,最新的支持unicode。采用latin-1标志位确定是采用UTF-8还是字节编码。同时文档也提到了:
    It can be speculated that the UTF-16 encoding standard was, from the beginning, expected to be able to hold all Unicode characters in one 16-bit entity, but then had to be extended, leaving a hole in the Unicode range to cope with backward compatibility.
    SoloCompany
        9
    SoloCompany  
       2014-07-09 00:52:52 +08:00
    Javascript 的字符串单位当然是定长16位字符,和 java 一样,最新的 Javascript 标准才支持 codePoint, 现在的大部分浏览器还不支持,java 则是在1.5的时候开始支持 codePoint
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1427 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 16:51 PVG 00:51 LAX 09:51 JFK 12:51
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86