【问题标题】:How to determine whether a set of characters in JavaScript is UTF-8 or not?如何判断 JavaScript 中的一组字符是否为 UTF-8?
【发布时间】:2014-03-16 03:34:19
【问题描述】:

这是以前提出的问题的一种变体,但我仍然无法找到答案,所以我试图将其提炼到问题的核心,希望有解决方案。

由于历史原因,我有一个数据库,其中某些文本条目不是 UTF-8。大多数是。过去 3 年的所有参赛作品都是。但一些较旧的条目不是。

找到非 UTF-8 字符很重要,这样我就可以避免使用它们,或者将它们转换为 UTF-8 用于我尝试生成的某些 XML。

我正在使用的服务器端 JavaScript 具有 ByteBuffer 类型,因此我可以将任何字符集视为单个字节并根据需要检查它们,并且不需要使用 String 类型,我知道这是有问题的这种情况。

在这种情况下,我是否可以检查文本以确定它是否是有效的 UTF-8?

我已经搜索了几个月 (;_;) 仍然无法找到答案。然而必须有一种方法可以做到这一点,因为 XML 验证器(如在主要浏览器中)能够在遇到非 UTF-8 字符时报告“编码错误”。

我只是想知道任何算法是如何完成的,这样我就可以尝试在 JavaScript 中进行相同类型的测试。一旦我知道哪些字符不好,我就可以将它们从 ISO-8859-1(例如)转换为 UTF-8。我有方法。

我只是不知道如何找出哪些字符不是 UTF-8。同样,我知道在这种情况下使用 JavaScript String 类型是有问题的,但我确实有另一种 ByteBuffer 类型,它可以按字节处理字符。

感谢大家提出的任何具体测试建议。

道格

【问题讨论】:

  • 如果一个字符的高位为 0 是合法的,因为它与 ASCII 字符相同,是否正确。如果高位由 n 个 1 组成,那么后续 n 个字节的高位必须为 10,如果是这样,那么它是合法的 UTF-8,否则不是?
  • 不管怎样,我自己的 JavaScript 测试与stackoverflow.com/questions/1275948/… 中提到的测试表明,显然不正确的 UTF-8 字符串是有效的 UTF-8。所以我仍然坚持试图弄清楚如何检测无效的 UTF-8。

标签: javascript utf-8 character-encoding


【解决方案1】:

我有同样的情况和问题。所有服务器端 JavaScript 字符串都是 16 位的,但如果我从端点获取 JSON,它可以是:UTF-8、ANSI (ASCII)、UCS2_BE、UCS2_LE。 UTF16 自然可以很好地转换为 JavaScript 16 位字符串,这是一个问题,因为可变长度字符编码会导致 AWS 中的 SQL 注入错误。但是,我使用的服务器端 JavaScript 将对 UTF-8 进行一些位移或填充,从而生成以  开头的 16 位 JavaScript 字符串 很好,因为我在 JavaScript 中没有 8 位字符串,所以我只检查前 3 个字符是否为 

你可能对位移没有同样的运气,但下面的函数对我有用。我确信有一个更好、更快更好的解决方案,但这篇文章已经发布了 2 年,有 715 次浏览,而不是一个单一的解决方案。

安德斯

随便叫吧:

var bolResult = isEncoded(strJSON);

/**
 * @description Check if string is UTF8 encoded
 * @param {string} JSON
 * @returns {boolean} true/false
 */
function isEncoded(strJSON) {
        /***************************
         * Valid string starts with:
         * {
         * 239, 187, 191
         ********************/
        var intCharCode0 = strJSON.charCodeAt(0);   //239
        var intCharCode1 = strJSON.charCodeAt(1);   //187
        var intCharCode2 = strJSON.charCodeAt(2);   //191

        if(intCharCode0 === 239 && intCharCode1 === 187 && intCharCode2 === 191){
            return true;
        }
        else{
            return false;
        }
}

【讨论】:

  • 如果你有一个 JavaScript 字符串并且编码不是 UTF-16,那么就出了问题。寻求防止这种情况发生。
猜你喜欢
  • 2012-01-24
  • 2013-04-23
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 2010-09-21
  • 2018-10-20
相关资源
最近更新 更多