我已经发布了几个类似的问题,对此我深表歉意,但仍然没有找到解决方案。
我有一个数据库,其中某些条目不是合法的 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;
}
}
你
try
(new TextDecoder("UTF-8", {fatal: true})).decode(…)
看看它是否不会抛出。
你
import NodeBuffer, {Buffer} from "node:buffer";
然后做
NodeBuffer.isUtf8(…)
.
你也这么做
"string".isWellFormed()
适用于 UTF-16。