如何比较出现相似字符但字符代码不同的字符串?
How to compare strings in which appears similar characters but different char codes?
我在比较字符代码不同但字符相似的字符串时遇到问题,如下所示:
console.log('³' === '3') // false;
由于字符代码不同,上述代码中的错误值:
console.log('³'.charCodeAt(0)) // 179
console.log('3'.charCodeAt(0)) // 51
将值转换为相等的通用解决方案是什么?我需要它,因为我需要比较所有数字,例如 1,2,3,4,5....
谢谢
查看 ASCII 折叠,它主要用于将重音字符转换为非重音字符。有一个 JS 库 here.
对于您提供的示例,它会起作用 - 对于其他示例,它可能不会。这取决于等价的定义方式(只有您知道 "similar" 的意思——不同的字符是不同的字符)。
如果您已经知道要映射的所有字符,最简单的方法就是自己定义一个映射:
var eqls = function(first, second) {
var mappings = { '³': '3', '3': '3' };
if (mappings[first]) {
return mappings[first] == mappings[second];
}
return false;
}
if (eqls('³', '3')) { ... }
没有"universal solution"
如果您只处理数字,您可以构建 "equivalence table",在其中为每个支持的字符定义一个 "canonical" 字符。
例如
var eqTable = []; // the table is just an array
eqTable[179] = 51; // ³ --> 3
/* ... */
然后构建一个简单的算法将字符串转换为规范形式
var original, // the source string - let's assume original=="³3"
var canonical = ""; // the canonical resulting string
var i,
n,
c;
n = original.length;
for( i = 0; i < n; i++ )
{
c = eqTable[ original.charCodeAt( i ) ];
if( typeof( c ) != 'undefined' )
{
canonical += String.fromCharCode( c );
}
else
{
canonical += original[ i ]; // you *may* leave the original character if no match is found
}
}
// RESULT: canonical == "33"
我在比较字符代码不同但字符相似的字符串时遇到问题,如下所示:
console.log('³' === '3') // false;
由于字符代码不同,上述代码中的错误值:
console.log('³'.charCodeAt(0)) // 179
console.log('3'.charCodeAt(0)) // 51
将值转换为相等的通用解决方案是什么?我需要它,因为我需要比较所有数字,例如 1,2,3,4,5....
谢谢
查看 ASCII 折叠,它主要用于将重音字符转换为非重音字符。有一个 JS 库 here.
对于您提供的示例,它会起作用 - 对于其他示例,它可能不会。这取决于等价的定义方式(只有您知道 "similar" 的意思——不同的字符是不同的字符)。
如果您已经知道要映射的所有字符,最简单的方法就是自己定义一个映射:
var eqls = function(first, second) {
var mappings = { '³': '3', '3': '3' };
if (mappings[first]) {
return mappings[first] == mappings[second];
}
return false;
}
if (eqls('³', '3')) { ... }
没有"universal solution"
如果您只处理数字,您可以构建 "equivalence table",在其中为每个支持的字符定义一个 "canonical" 字符。
例如
var eqTable = []; // the table is just an array
eqTable[179] = 51; // ³ --> 3
/* ... */
然后构建一个简单的算法将字符串转换为规范形式
var original, // the source string - let's assume original=="³3"
var canonical = ""; // the canonical resulting string
var i,
n,
c;
n = original.length;
for( i = 0; i < n; i++ )
{
c = eqTable[ original.charCodeAt( i ) ];
if( typeof( c ) != 'undefined' )
{
canonical += String.fromCharCode( c );
}
else
{
canonical += original[ i ]; // you *may* leave the original character if no match is found
}
}
// RESULT: canonical == "33"