我已经发布了几个类似的问题,我为此道歉,但仍然没有找到解决方案。
我有一个数据库,其中一些条目不合法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;
}
}