V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
xia0ta0
V2EX  ›  程序员

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

  •  
  •   xia0ta0 · 2014-07-08 09:12:37 +08:00 · 5645 次点击
    这是一个创建于 3825 天前的主题,其中的信息可能已经有所发展或是发生改变。
    为了兼容之前的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   ·   实用小工具   ·   3405 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:39 · PVG 18:39 · LAX 02:39 · JFK 05:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.