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

问题描述 投票:0回答:1

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

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

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

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

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

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

安德烈·布拉沃·穆辰

它是以 ISO-8859-1 格式输入的,当浏览器将其视为 ISO-8859-1 时看起来不错,但如果浏览器被迫以 UTF-8 格式查看,则字符串中似乎存在无效字符。

我的 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;
    }
}
javascript utf-8 character-encoding
1个回答
0
投票

UTF-8 验证

一般在任何 Javascript 环境中,

try

(new TextDecoder("UTF-8", {fatal: true})).decode(…)

看看它是否不会抛出。

在 Node.js 中,

import NodeBuffer, {Buffer} from "node:buffer";

然后做

NodeBuffer.isUtf8(…)

.

UTF-16 验证

你也这么做

"string".isWellFormed()

适用于 UTF-16。

© www.soinside.com 2019 - 2024. All rights reserved.