Javascript 如何比较出现相似字符但不同字符代码的字符串?
我无法比较具有不同字符代码但类似字符的字符串,如下所示:Javascript 如何比较出现相似字符但不同字符代码的字符串?,javascript,string-comparison,keycode,Javascript,String Comparison,Keycode,我无法比较具有不同字符代码但类似字符的字符串,如下所示: console.log('³' === '3') // false; 由于字符代码不同,上述代码的值为False: console.log('³'.charCodeAt(0)) // 179 console.log('3'.charCodeAt(0)) // 51 什么是将值转换为相等的通用解决方案?我需要它,因为我需要比较所有数字,如1,2,3,4,5…. 感谢您查看ASCII折叠,它主要用于将重音字符转换为非重音字符。它有一个JS
console.log('³' === '3') // false;
由于字符代码不同,上述代码的值为False:
console.log('³'.charCodeAt(0)) // 179
console.log('3'.charCodeAt(0)) // 51
什么是将值转换为相等的通用解决方案?我需要它,因为我需要比较所有数字,如1,2,3,4,5….
感谢您查看ASCII折叠,它主要用于将重音字符转换为非重音字符。它有一个JS库 对于您提供的示例,它将起作用-对于其他示例,它可能不起作用。这取决于等价的定义(除了你之外,没有人知道“相似”是什么意思——不同的字符是不同的字符) 如果您已经知道要映射的所有字符,最简单的方法就是自己定义映射:
var eqls = function(first, second) {
var mappings = { '³': '3', '3': '3' };
if (mappings[first]) {
return mappings[first] == mappings[second];
}
return false;
}
if (eqls('³', '3')) { ... }
查看ASCII折叠,它主要用于将重音字符转换为非重音字符。它有一个JS库 对于您提供的示例,它将起作用-对于其他示例,它可能不起作用。这取决于等价的定义(除了你之外,没有人知道“相似”是什么意思——不同的字符是不同的字符) 如果您已经知道要映射的所有字符,最简单的方法就是自己定义映射:
var eqls = function(first, second) {
var mappings = { '³': '3', '3': '3' };
if (mappings[first]) {
return mappings[first] == mappings[second];
}
return false;
}
if (eqls('³', '3')) { ... }
没有“通用解决方案”
如果您只需要处理数字,您可以建立“等价表”,其中为每个支持的字符定义一个“规范”字符
比如说
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"
var-original,//源字符串-假设original==“3”
var canonical=”“;//标准化的结果字符串
var i,
N
C
n=原始长度;
对于(i=0;i
没有“通用解决方案”
如果您只需要处理数字,您可以建立“等价表”,其中为每个支持的字符定义一个“规范”字符
比如说
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"
var-original,//源字符串-假设original==“3”
var canonical=”“;//标准化的结果字符串
var i,
N
C
n=原始长度;
对于(i=0;i
您能给我们一个“相似字符”的明确定义吗?你只担心十位数的字符吗?JavaScript看不出它们是相似的,它只看到不同的字符代码…@Andrew L谢谢@Erik,在寻求帮助时不要挖苦人,这可能对你有好处。^那就创建一张地图。你能给我们一个“相似人物”的明确定义吗?你只担心十位数的字符吗?JavaScript看不出它们是相似的,它只看到不同的字符代码…@Andrew L谢谢@Erik,在寻求帮助时不要挖苦人,这对你也有好处。^那就创建一张地图。谢谢你的回答<代码>如果(eqls('³','3')!==false){…}感谢您的回答<代码>如果(eqls('³','3')!==false){…}为什么不使用关联数组?比在一个普通数组中处理所有存在的东西更简单。当你解析一个字符串时,你不需要用一个关联数组来处理“存在的东西”吗?我的意思是:即使您使用关联数组,您也必须检查是否存在匹配项,并决定在未找到匹配项时如何操作。对不起,是的,您可以这样做,但它更简单、更灵活、不那么晦涩(例如,您可以使用字符串文字而不是ASCII码,因为您必须使用数组索引)。为什么不使用关联数组?比在一个普通数组中处理所有存在的东西更简单。当你解析一个字符串时,你不需要用一个关联数组来处理“存在的东西”吗?我的意思是:即使您使用关联数组,您也必须检查是否存在匹配项,并决定在未找到匹配项时如何操作。对不起,是的,您可以这样做,但它更简单、更灵活,而且不太模糊(例如,您可以使用字符串文字而不是ASCII码,因为您必须使用数组索引)。