JavaScript toLowerCase奇怪的行为

Jasalguero

我有一个小型应用程序,它读取推文并尝试匹配关键字,并且我注意到特定字符串的这种奇怪行为:

var text = "The Νіk​е D​un​k​ Ніgh ЅΒ 'Uglу Ѕwеаt​еr​' іѕ n​оw аvаіlаblе http://swoo.sh/IHVaTL";
var lowercase = text.toLowerCase()

现在小写的值是:

http://swoo.sh/ihvatl上的sig'sugrуswét'r'

因此,看起来该字符串的格式很奇怪,我仔细检查了一些字母,发现:

text.charAt(4)
>"N"
text.charCodeAt(5)
>925
'N'.charCodeAt(0)
>78

因此,即使看起来像正常的N,与之关联的unicode也对应于

0925थ德凡那加字母THA

根据unicode图表

因此,我对这种情况如何发生以及是否有任何“转换”为假定的真实字母感到困惑

达格·纳比特

您可以使用每个拉丁字母(大写和小写)创建一个单独的画布进行比较。每次遇到不在Latin-1范围内的字符时,请为其创建一个新画布,然后使用图像差异算法将其与每个拉丁字母字符进行比较用最匹配的字符替换非拉丁字符。

例如:

var latinize = (function () {
    var latinLetters = [],
        canvases = [],
        size = 16,
        halfSize = size >> 1;

    function makeCanvas(chr) {
        var canvas = document.createElement('canvas'),
            context = canvas.getContext('2d');

        canvas.width = size;
        canvas.height = size;
        context.textBaseline = 'middle';
        context.textAlign = 'center';
        context.font = (halfSize) + "px sans-serif";
        context.fillText(chr, halfSize, halfSize);

        return context;
    }

    function nextChar(chr) {
        return String.fromCharCode(chr.charCodeAt(0) + 1);
    }

    function setupRange(from, to) {
        for (var chr = from; chr <= to; chr = nextChar(chr)) {
            latinLetters.push(chr);
            canvases.push(makeCanvas(chr));
        }
    }

    function calcDistance(ctxA, ctxB) {
        var distance = 0,
            dataA = ctxA.getImageData(0, 0, size, size).data,
            dataB = ctxB.getImageData(0, 0, size, size).data;

        for (var i = dataA.length; i--;) {
            distance += Math.abs(dataA[i] - dataB[i]);
        }

        return distance;
    }

    setupRange('a', 'z');
    setupRange('A', 'Z');
    setupRange('', ''); // ignore blank characters

    return function (text) {
        var result = "",
            scores, canvas;

        for (var i = 0; i < text.length; i++) {
            if (text.charCodeAt(i) < 128) {
                result += text.charAt(i);
                continue;
            }
            scores = [];
            canvas = makeCanvas(text.charAt(i));
            for (var j = 0; j < canvases.length; j++) {
                scores.push({
                    glyph: latinLetters[j],
                    score: calcDistance(canvas, canvases[j])
                });
            }
            scores.sort(function (a, b) {
                return a.score - b.score;
            });
            result += scores[0].glyph;
        }

        return result;
    }
}());

这会将您的测试字符串转换为“现在可用”。

替代方法是创建一个巨大的数据结构,将所有相似字符映射到与Latin-1等效的字符,就像@willy答案中的库那样。对于“浏览器JavaScript”而言,这非常繁琐,并且可能不适合发送给客户端,如您通过查看该项目的源代码可以看到的那样。

http://jsfiddle.net/Ly5Lt/4/

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

奇怪的JavaScript行为(作业)

来自分类Dev

JavaScript toString()奇怪的行为

来自分类Dev

JavaScript getElementById的奇怪行为

来自分类Dev

Javascript的奇怪行为

来自分类Dev

Javascript for 循环奇怪的行为

来自分类Dev

数组的奇怪JavaScript变量行为

来自分类Dev

JavaScript中奇怪的函数行为

来自分类Dev

JavaScript对象分配的奇怪行为

来自分类Dev

JavaScript OnClick事件的奇怪行为

来自分类Dev

javascript调用方法的奇怪行为

来自分类Dev

JavaScript日期对象-奇怪的行为

来自分类Dev

JavaScript中奇怪的函数行为

来自分类Dev

Javascript,奇怪的递归行为,DFS

来自分类Dev

JavaScript while循环奇怪的行为

来自分类Dev

Javascript函数中的奇怪行为

来自分类Dev

Javascript的“拼接”方法奇怪的行为

来自分类Dev

JavaScript 对象更新行为(奇怪?)

来自分类Dev

javascript中循环的奇怪行为

来自分类Dev

javascript Promise 中的奇怪行为

来自分类Dev

javascript上奇怪的javascript行为onClick ondiv

来自分类Dev

字符串数组的奇怪Javascript行为

来自分类Dev

javascript中检查条件的奇怪行为

来自分类Dev

parseInt和负零在javascript:奇怪的行为?

来自分类Dev

JavaScript中奇怪的FOR循环行为

来自分类Dev

Javascript新Date函数中的奇怪行为

来自分类Dev

Onenote API,从JavaScript修补时的奇怪行为

来自分类Dev

Visual Studio 2015 JavaScript Intellisense奇怪的行为

来自分类Dev

JavaScript中名为“状态”的变量的奇怪行为

来自分类Dev

JavaScript中奇怪的FOR循环行为