提问者:小点点

检查javascript字符串是否有效UTF-8


用户可以复制并粘贴到文本区域html输入中,有时粘贴无效的UTF-8个字符,例如,从包含制表符的rtf文件复制并粘贴。

如何检查字符串是否为有效的UTF-8?


共2个答案

匿名用户

我想你误解了“UTF-8个字符”的意思;UTF-8是Unicode的一种编码,它可以表示(不断增长的)Unicode标准中定义的任何字符、字形和字位。Unicode代码点比可能的UTF8字节值少,所以唯一的“无效UTF8字符”是不映射到任何Unicode代码点的UTF8字节序列,但我想你指的不是这个。

例如,从包含制表符的rtf文件中复制和粘贴。

RTF是一个独立于底层编码方案工作的格式化系统——您可以将RTF与ASCII、UTF-8、UTF-16和其他编码一起使用。关于帖子中的超文本标记语言文本框,

RTF文件中的制表符不是一个RTF的特性:它们只是普通的ASCII样式制表符,即\t0x09,它们也出现在Unicode中,因此也可以出现在UTF-8编码文本中;此外,允许用户将它们粘贴到中对于网络浏览器来说是完全有效的

Javascript(ECMAScript)本身是Unicode原生的;也就是说,ECMAScript规范确实要求JS引擎在某些地方使用UTF-16表示,例如在抽象操作IsStringWellFormedUnicode中:

抽象操作IsStringWellFormedUnicode接受参数字符串(aString)并返回一个布尔值。它将字符串解释为UTF-16编码代码点的序列,如6.1.4中所述,并确定它是否是格式良好的UTF-16序列。

…但是规范的这一部分是为JS引擎程序员准备的,而不是为浏览器编写JS的人——事实上,我想说,在网络浏览器中,任何JSstring值总是有效的字符串,总是可以序列化为UTF-8和UTF-16,JS脚本不应该关心字符串内容的实际内存编码。

所以鉴于你的问题是这样写的:

用户可以复制并粘贴到文本区域html输入中,有时粘贴无效的UTF-8个字符,例如,从包含制表符的rtf文件复制并粘贴。

如何检查字符串是否为有效的UTF-8?

我将把它解释为:

用户可以从写字板之类的程序中复制RTF文本并将其粘贴到超文本标记语言

如何检测这些不需要的字符并通知用户-或删除这些不需要的字符?

…对此我的回答是:

我建议使用匹配不可见字符的正则表达式去除不需要的字符(从这里:匹配不可打印/非ascii字符并从文本中删除)

let textBoxContent = document.getElementById( 'myTextarea' ).value;
textBoxContent = textBoxContent.replace( /[^\x20-\x7E]+/g, '' );

>

  • 表达式[^\x20-\x7E]将代码点范围0x20(32,普通空格字符')中的任何字符都匹配到0x7E(127,标题'~'字符),所有其他字符将被删除,包括非拉丁文本。

    最后的g开关使其成为全局查找和替换操作;如果没有g,则只会删除第一个不需要的字符。

    范围0x20-0x7E有效,因为Unicode的前127个代码点与ASCII相同,可以在这里看到:http://www.asciitable.com/

  • 匿名用户

    只是一个想法:

    function checkUTF8(text) {
        var utf8Text = text;
        try {
            // Try to convert to utf-8
            utf8Text = decodeURIComponent(escape(text));
            // If the conversion succeeds, text is not utf-8
        }catch(e) {
            // console.log(e.message); // URI malformed
            // This exception means text is utf-8
        }   
        return utf8Text; // returned text is always utf-8
    }