在JavaScript中检测无效的UTF-8字符

时间:2014-02-27 11:20:28

标签: javascript utf-8 character-encoding

我已经发布了几个类似的问题,我为此道歉,但仍然没有找到解决方案。

我有一个数据库,其中一些条目不合法UTF-8。如果我知道哪些条目不是,我可以将它们转换为UTF-8。我的JavaScript版本有一个方法可以做到这一点。而且这个功能似乎也有效:

function utf8_encode(str) {
    return unescape( encodeURIComponent( string ) );
}

但是,如果文本已经是UTF-8,则上述函数将破坏已经有效的UTF-8字符。你不应该将UTF-8转换为UTF-8。

所以我的问题归结为:我如何在JavaScript中使用字符串并确定字符串是否有效UTF-8?

此类字符串的示例可能是:

AndréBlavóMÜCHEN

在ISO-8859-1中输入并且当浏览器将其视为ISO-8859-1时看起来很好但是如果强制浏览器以UTF-8查看,则看起来字符串中存在无效字符。 / p>

我的JavaScript版本也有ByteBuffer()类型,因此我可以在必要时一次一个字节地处理字符串中的字节。

任何建议都会非常感激。感谢。

道格

2014年2月28日更新:

我想出了这个,但这还不够。它捕获许多非UTF-8字符。但是很多情况下它认为文本是有效的。我被卡住了。有人有什么想法吗?

function stringIsValidUtf8 (text) {
    if (typeof(text)==="object"){
        for (key in text){
            text[key]=this.toUTF8(text[key]);
        }
    }
    else if (typeof(text) ==="string"){
        var max = text.length;

        for (var i=0; i< max; i++){

            var c1 = text.charAt(i);
            if (c1 >= "\xc0"){
                var c2 = i+1>=max? "\x00" : text[i+1];
                var c3 = i+2 >= max? "\x00" : text[i+2];
                var c4 = i+3 >= max? "\x00" : text[i+3];

                if (c1>= "\xc0" & c1 <="\xdf"){
                    if (c2 >= "\x80" && c2 <= "\xbf"){
                        i++
                    }
                    else{
                        return false;
                    }
                }

                else if (c1 >= "\xe0" & c1 <= "\xef"){
                    if (c2>= "x80" && c2 <= "\xbf" && c3 >= "\x80" && c3 <="\xbf"){
                        i=i+2; 
                    }
                    else{
                        return false;
                    }
                }

                else if (c1>= "\xf0" & c1 <="\xf7"){
                    if (c2>= "\x80" && c2 <="\xbf" && c3 >= "\x80" && c3 <="\xbf" && c4 >= "\x80" && c4 <= "\xbf"){
                        i=i+2;
                    }
                    else{
                        return false;
                    }
                }

                else{
                    return false;
                }

            }
            else if ((c1 & "\xc0") === "\x80"){
                return false;
            }
        }
        return true;
    }
    else{
        return true;
    }
}

0 个答案:

没有答案