我有一个小型应用程序,它读取推文并尝试匹配关键字,并且我注意到特定字符串的这种奇怪行为:
var text = "The Νіkе Dunk Ні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
因此,我对这种情况如何发生以及是否有任何“转换”为假定的真实字母感到困惑
您可以使用每个拉丁字母(大写和小写)创建一个单独的画布进行比较。每次遇到不在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”而言,这非常繁琐,并且可能不适合发送给客户端,如您通过查看该项目的源代码可以看到的那样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句