如何搜索忽略重音字符的字符串(例如ã = a)[重复]
Posted
技术标签:
【中文标题】如何搜索忽略重音字符的字符串(例如ã = a)[重复]【英文标题】:How to search a string ignoring accent characters (e.g. ã = a) [duplicate] 【发布时间】:2011-08-18 00:54:52 【问题描述】:可能重复:Programatic Accent Reduction in javascript (aka text normalization or unaccenting)
我正在尝试查找忽略重音的字符串,因此在我的示例中,如果我搜索 avião 或 aviao 我总是会得到两个结果。 这是一个启动...
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="http://jquery.com/src/jquery-latest.js"></script>
<script type="text/javascript">
$(function ()
$('input').keyup(function (event)
if (jQuery.trim($('input').val()) == "")
return;
var str = jQuery.trim($('input').val()).split(" ");
jQuery.each($('table > tbody > tr > td:last-child'), function ()
var colval = $(this).html().toLowerCase();
jQuery.each(str, function ()
var term = this.toLowerCase();
if (colval.indexOf(term) != -1)
alert(colval);
);
);
);
);
</script>
</head>
<body>
<input type="text" id="q" />
<div>
<table>
<thead>
<tr>
<th>Id</th>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>avião resume</td>
</tr>
<tr>
<td>2</td>
<td>résumé</td>
</tr>
<tr>
<td>3</td>
<td>resume</td>
</tr>
<tr>
<td>4</td>
<td>aviao résumé</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
Sample
【问题讨论】:
我冒昧地编辑了标题以使其更清晰,如果您不喜欢它,请随时回滚。 @Martijn 有点 - 很好的发现 - 但前提和可能的答案略有不同(字符串比较与在大型文档中搜索) @Pekka 但使用 JS 字符串比较;最终还是一样的解决方案。 @Martijn mmm,但副本中的答案意味着必须在搜索之前对整个文档进行规范化(据我所知)。也许这是唯一的方法,但这并不好。也许还有其他方法 @Pekka 在 JavaScript 支持正确的 unicode 正则表达式支持之前,我担心这是您唯一的选择:-/ 【参考方案1】:对于它的价值,有一次我已经构建了拉丁 1 unicode 代码点到它们的 ascii 对应物的映射。
你可以这样使用:
var effectiveCharCode = CODE_NO_DIACRITICS[actualCharCode];
所以,0 (s1 > s2) 的字符串比较方法可能是这样的:
function compareIgnoringDiacritics(s1, s2)
for(var i = 0; i < s1.length && i < s2.length; i++)
var cmp;
if((cmp = ((CODE_NO_DIACRITICS[s1.charCodeAt(i)] - CODE_NO_DIACRITICS[s2.charCodeAt(i)]))) != 0)
return cmp;
return s1.length - s2.length;
这是桌子:
var CODE_NO_DIACRITICS = [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
90, 91, 92, 93, 94, 95, 96, 65, 66, 67,
68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
88, 89, 90, 123, 124, 125, 126, 127, 128, 129,
130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
190, 191, 65, 65, 65, 65, 65, 65, 198, 67,
69, 69, 69, 69, 73, 73, 73, 73, 68, 78,
79, 79, 79, 79, 79, 215, 79, 85, 85, 85,
85, 89, 222, 223, 65, 65, 65, 65, 65, 65,
230, 67, 69, 69, 69, 69, 73, 73, 73, 73,
240, 78, 79, 79, 79, 79, 79, 247, 79, 85,
85, 85, 85, 89, 254, 89
];
【讨论】:
请原谅我的幼稚,但这对我有什么帮助? (CODE_NO_DIACRITICS['á']; 返回未定义) 好吧,映射使用字符代码而不是字符(该示例可能具有误导性),因此您可能会使用 String.charCodeAt() 获取字符串中每个字符的字符代码值,然后映射那。像 CODE_NO_DIACRITICS[someString.charCodeAt(0)]。以上是关于如何搜索忽略重音字符的字符串(例如ã = a)[重复]的主要内容,如果未能解决你的问题,请参考以下文章