2016-03-30 48 views
3

用户可以复制并粘贴到textarea html输入中,有时会粘贴无效的UTF-8字符,例如,从包含选项卡的rtf文件进行复制和粘贴。检查javascript字符串是否有效UTF-8

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

+1

可能帮助你http://stackoverflow.com/questions/20639052/check -if-the-bytes-sequence-is-valid-utf-8-sequence-in-javascript –

+0

看起来类似于[在Javascript中验证用户的UTF-8名称](http://stackoverflow.com/questions/6381752/ validating-users-utf-8-name-in-javascript) – Abhijit

回答

1

我想你误解了“UTF-8字符”的含义。 UTF-8是Unicode的一种编码,它可以表示记录的人类历史中曾经存在的每一个字符和字形,所以在这个范围内没有“无效的”UTF-8字符。

RTF是一种独立于底层编码系统工作的格式化系统 - 您可以使用带有ASCII,UTF-8,UTF-16等的RTF。 HTML中的文本框只能尊重纯文本,所以任何RTF格式都会自动删除(除非您使用的是“丰富编辑”组件,我认为您不是)。

但是你确实描述了诸如空格字符(如制表符:\t)的内容以Unicode(以及UTF-8)表示。包含这些字符的字符串仍然是“有效的UTF-8”,就业务需求而言,它是无效的。

我建议使用符合不可见的字符(从这里开始:Match non printable/non ascii characters and remove from text)一个正则表达式刚剥出想要的字符

textBoxContent = textBoxContent.replace(/[^\x20-\x7E]+/g, ''); 

表达[^\x20-\x7E]匹配的代码点范围0x20不属于任何字符(32 ,正常空格字符' ')至0x7E(127,字符'~'字符),所有其他将被删除。

Unicode的首个127码点是相同的ASCII码,可以在这里看到:http://www.asciitable.com/

+1

为了更正这个答案中的一些误解:没有像UTF8“characters”这样的东西;作为编码方案,存在“UTF8字节序列”,编码Unicode码点,并且这些字节序列在字节序列中可能绝对受到非法值的影响。同样,Unicode作为“正字法结构”到数字代码*的形式映射也具有可能不被使用的某些数字。遇到含有非法字节序列的UTF8字节流或含有非法数字的解码Unicode序列是完全可能的,因此:是的,存在“无效的UTF-8字符”。 –

-1

只是一个想法:

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 
} 
+0

'escape'已弃用,不应使用(因为它无法正确处理Unicode) – Quentin