【问题标题】:How to calculate byte length containing UTF8 characters using javascript?如何使用javascript计算包含UTF8字符的字节长度?
【发布时间】:2014-11-17 14:16:53
【问题描述】:

我有文本框,用户可以在其中输入 ASCII/UTF-8 或两者组合的字符。 javascript中是否有任何API可以计算在文本框中输入的字符的字符串长度(以字节为单位)。

如果我输入 ascii 字符,假设:mystring - 长度将计算为 8。但是当输入 UTF8 字符时,字符可以是 2/3/4 字节。

假设输入的字符:i ♥ u ,字节长度为 5。

文本框可以接受最大长度为 31 个字符。 但是如果输入的是 UTF8 字符,它将不接受字符串:i ♥ u i ♥ u i ♥ u i ♥ u i ♥ u 。长度为 30。

我们能否限制用户输入不超过 31 个字符,即使是 UTF8 字符也是如此。

【问题讨论】:

    标签: javascript utf-8


    【解决方案1】:

    在 JavaScript 中计算 UTF8 字节的次数很多,环顾四周,您会发现许多可以提供帮助的库(这里是一个示例:https://github.com/mathiasbynens/utf8.js)。我还发现了一个线程 (https://gist.github.com/mathiasbynens/1010324),其中包含专门针对 utf8 字节计数的解决方案。

    这是该线程中最小、最准确的函数:

    function countUtf8Bytes(s){
        var b = 0, i = 0, c
        for(;c=s.charCodeAt(i++);b+=c>>11?3:c>>7?2:1);
        return b
    }
    

    注意:我重新排列了一下,以便签名更容易阅读。然而,它仍然是一个非常紧凑的函数,对某些人来说可能难以理解。

    您可以使用此工具检查其结果:https://mothereff.in/byte-counter

    对您的 OP 的一个更正,您提供的示例字符串 i ♥ u 实际上是 7 个字节,此函数确实计算正确。

    【讨论】:

    【解决方案2】:

    实验性的TextEncoder API 可用于此目的,但 Internet Explorer 或 Safari 不支持:

    (new TextEncoder()).encode("i ♥ u i ♥ u i ♥ u i ♥ u i ♥ u").length;
    

    另一种方法是对字符串进行 URI 编码并计算字符数和 % 编码的转义序列,如 this library

    ~-encodeURI("i ♥ u i ♥ u i ♥ u i ♥ u i ♥ u").split(/%..|./).length
    

    github页面有一个兼容性列表,不幸的是不包括IE10,而是IE9。

    由于我还不能发表评论,我还要在这里指出,接受的答案中的解决方案不适用于由多个 UTF-16 代码单元组成的代码点。

    【讨论】:

      【解决方案3】:

      截至 2018 年,最兼容和最可靠的方法似乎是使用 blob api。

      new Blob([str]).size
      

      Even supported in IE10 如果有人再使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-07
        • 2015-01-21
        • 1970-01-01
        • 2011-02-14
        • 1970-01-01
        • 2018-05-01
        • 2016-11-01
        相关资源
        最近更新 更多