【问题标题】:check if javascript string is valid UTF-8检查 javascript 字符串是否是有效的 UTF-8
【发布时间】:2016-07-18 19:36:57
【问题描述】:

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

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

【问题讨论】:

标签: javascript html utf-8


【解决方案1】:

我认为您误解了“UTF-8 字符”的含义。 UTF-8 是一种 Unicode 编码,它可以表示几乎所有人类历史上曾经存在过的单个字符和字形,因此不存在“无效”的 UTF-8 字符。

RTF 是一个独立于底层编码系统工作的格式化系统 - 您可以将 RTF 与 ASCII、UTF-8、UTF-16 等一起使用。 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/

【讨论】:

  • 为了纠正这个答案中的一些误解:没有UTF8“字符”这样的东西;作为一种编码方案,有“UTF8 字节序列”,对 Unicode 代码点进行编码,这些字节序列绝对会受到字节序列中非法值的影响。类似地,Unicode 作为“正交结构”到数字代码的正式映射具有某些可能无法使用的数字。遇到带有非法字节序列的 UTF8 字节流,或包含非法数字的解码 Unicode 序列是完全可能的,所以:是的,存在“无效的 UTF-8 字符”。
【解决方案2】:

只是一个想法:

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
}

【讨论】:

  • escape 已弃用,不应使用(因为它无法正确处理 Unicode)
猜你喜欢
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 2014-01-05
  • 2016-05-23
  • 2018-09-07
  • 2014-03-18
相关资源
最近更新 更多