用户可以复制并粘贴到文本区域html输入中,有时粘贴无效的UTF-8个字符,例如,从包含制表符的rtf文件复制并粘贴。
如何检查字符串是否为有效的UTF-8?
我想你误解了“UTF-8个字符”的意思;UTF-8是Unicode的一种编码,它可以表示(不断增长的)Unicode标准中定义的任何字符、字形和字位。Unicode代码点比可能的UTF8字节值少,所以唯一的“无效UTF8字符”是不映射到任何Unicode代码点的UTF8字节序列,但我想你指的不是这个。
例如,从包含制表符的rtf文件中复制和粘贴。
RTF是一个独立于底层编码方案工作的格式化系统——您可以将RTF与ASCII、UTF-8、UTF-16和其他编码一起使用。关于帖子中的超文本标记语言文本框,
RTF文件中的制表符不是一个RTF的特性:它们只是普通的ASCII样式制表符,即\t
或0x09
,它们也出现在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
}