localeCompare是将数据转换成什么编码??

ma2jiajia 2010-09-19 04:00:34
使用localeCompare对数组进行排序,在IE和FF下,对中文的排序是根据拼音来着,而且效果很不错
至少“窦”字和“豆”字也能正确排序(GBK编码是按照拼音排的,但是窦字排在很后面)
查看了GB18030、UTF-8、BIG5、GB2312
这些编码都是按照部首来排的
那IE和FF使用localeCompare到底是根据什么编码来排的呢??
...全文
418 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
浴火_凤凰 2010-09-20
  • 打赏
  • 举报
回复
看看。。。。。。。
ma2jiajia 2010-09-20
  • 打赏
  • 举报
回复
不知道有没有Linux桌面用户(我虚拟机里装的都只有控制台,没桌面)
试试看FF在Linux下使用localeCompare的拼音排序在Linux下是否同样有效呢??

在Win下(区域设置中,排序为“拼音”),IE和FF都可以正常排序的示例代码
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" language="javascript">
function cusSort(th, order){
order = typeof order !== "undefined" ? order : 1;
var tb = th.parentNode.parentNode.parentNode.tBodies[0];
var arr = [];
for(var i=0; i<tb.rows.length; i++) {
var cell = tb.rows[i].cells[th.cellIndex];
var txt = "";
for(var n = cell.firstChild; n !== null; n.nextSibling) {
if(n.nodeType === 3) {
txt = document.all ? n.nodeValue : n.nodeValue.replace(/^\\n*|^\s*|\s*$|\\n*$/g, "");
break;
}
}
arr.push([txt, tb.rows[i].rowIndex]);
}
arr.sort(function(a, b) { return a[0].localeCompare(b[0]); });
var ntab = tb.parentNode.cloneNode(true);
while(tb.rows.length > 0) tb.deleteRow(0);
if(order) {
// 如果不使用cloneNode,添加行到旧表格时,对应的ntab中的行就消失了...Orz
for(var i=(arr.length-1); i>=0; i--) tb.appendChild(ntab.rows[arr[i][1]].cloneNode(true));
} else {
for(var i=0; i<arr.length; i++) tb.appendChild(ntab.rows[arr[i][1]].cloneNode(true));
}
th.onclick = function() { cusSort(this, !order) };
}
</script>
</head>
<body>
<table id="tab" border="1">
<thead>
<tr>
<th>ID</th>
<th onclick="cusSort(this)">NAME</th>
<th>CLASS</th>
<th>HOME</th>
<th>DESC</th>
</tr>
</thead>
<tbody>
<tr>
<td>01</td>
<td>


JIRO



</td>
<td>A3-5</td>
<td>士大夫棵</td>
<td> </td>
</tr>
<tr>
<td>02</td>
<td>潘生</td>
<td>A3-5</td>
<td>士大夫棵</td>
<td> </td>
</tr>
<tr>
<td>03</td>
<td>戴生</td>
<td>A3-5</td>
<td>士大夫棵</td>
<td> </td>
</tr>
<tr>
<td>04</td>
<td>
肖生
</td>
<td>A3-5</td>
<td>士大夫棵</td>
<td> </td>
</tr>
<tr>
<td>05</td>
<td>蔡国柱</td>
<td>A3-5</td>
<td>士大夫棵</td>
<td> </td>
</tr>
<tr>
<td>06</td>
<td>欧阳兆年</td>
<td>A3-5</td>
<td>士大夫棵</td>
<td> </td>
</tr>
</tbody>
</table>
</body>
</html>
ma2jiajia 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 theforever 的回复:]
后来试验了一下普通的排序,还真是惨不忍睹.
localeCompare是使用用户机器设置的区域排序规则来进行排序.而我们平时在操作系统的资源管理器里,如果选择"按名称排序",就会看到,是按拼音排序的,至于豆窦什么的排序先后,在这里也都是比较符合正常认识的.虽然没看到有什么确定资料,但我可以十成把握地猜测localeCompare调用的排序规则,就是这个.
就象空气一样,天天用已经习以为常,但真……
[/Quote]
事实证明你是对的
“控制面板”-->“区域和语言设置”-->“区域选项”中“自定义”-->“排序”-->“拼音”(XP中为发音)
我把它换成“笔划”后,再对本来可以正常调用localeCompare的表格进行排序,结果就是按笔划排序了
ma2jiajia 2010-09-20
  • 打赏
  • 举报
回复
更正,我还以为unicode 5.2中,汉字是从\u3000开始,刚看了下,是从\u3400开始...
  • 打赏
  • 举报
回复
后来试验了一下普通的排序,还真是惨不忍睹.
localeCompare是使用用户机器设置的区域排序规则来进行排序.而我们平时在操作系统的资源管理器里,如果选择"按名称排序",就会看到,是按拼音排序的,至于豆窦什么的排序先后,在这里也都是比较符合正常认识的.虽然没看到有什么确定资料,但我可以十成把握地猜测localeCompare调用的排序规则,就是这个.
就象空气一样,天天用已经习以为常,但真去思考,却还真有问题.比如这个排序规则,具体的数据表在哪,如何方便地调用(那样就不用再查自己建的拼音字库了),这些仍是有疑问的.
希望其他有兴趣有时间的朋友关注一下吧.
xuzuning 2010-09-20
  • 打赏
  • 举报
回复
GB2312 最早的国标字库,内分为一级字库(按拼音排序)和二级字库(按部首排序)
GBK 在 GB2312 基础上扩展,包容了 BIG5(台湾的大五码)
GBK 的国际标准(unicode)是 CP936(又称 UCS-2),仅编码不同,排列顺序是一样的
UTF-8(属另一套国际标准) 与 unicode 的码值间存在简单的数学关系
GB18030 是在 GBK 上的又一扩展,由于技术上的原因,目前新扩展的部分尚不能被现行的操作系统支持
ma2jiajia 2010-09-20
  • 打赏
  • 举报
回复
BTW,上面说我花半天去找GB18030等编码,倒不是说研究很久怎么样,而是...我搜索半天没找到官方网站,或者是有权威一点的,可以下载到完整编码(支持搜索)的网站...
utf-8倒是一下就找到了...
ma2jiajia 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 theforever 的回复:]
不好意思,好久没看那个程序,完全记错了.刚才看了下,在里面的编码,其实也是按照部首来的.只不过有"按照拼音分类"这么一个选项.而这个选项的结果,也十分不准确.就如楼主所说的那样.
不过,拼音表汉字集,也很常见,我们经常用它来搜索查找拼音.我想你所说的,就可能是基于此.
[/Quote]
我前天花了半天特地去看了GB18030、UTF-8、GB2312、BIG5、GBK等常用汉字编码的,除了GBK外,其余都是按部首来排序的(GBK后面那些字估计是后来加的,所以无法按照拼音来排序了)
拼音汉字集??
能给个链接吗??
我现在的想法是,自己弄个2个数组来存放UTF-8里的汉字集...
例如下面的
var a = [];
a[11095] = 10;
a[15433] = 5;
// 没有读音的(比如偏旁部首),就统一用zzzzz5来代替,汉字拼音中,最多个应该就5个字母吧??(zhong)
// 或者就干脆返回对应的十进制utf-8编码
var b = ['zzzzz4','han','han1','han2','han3','han4','zi','zi1','zi2','zi3','zi4'];
var str = 'sdkfj汉字kjsdf';
str = str.replace(/[^\x30-\x80]/g, function($0) {
return b[a[parseInt(escape($0).substring(2), 16) - 12288]];
});
alert(str);


数组A对应utf-8里,从\u3000开始的汉字,如果是没有读音的,就对应b数组中的0,如果是有读音的,则对应b数组中,相应的读音所对应的下标,数据先检测是否带有汉字(是否在\u30-\u80区),如果有带汉字,则把汉字转换成相应的utf-8编码,然后再转为10进制,再减去12288(utf-8中,第一个汉字是从\u3000开始的)
不过要把utf-8里的汉字都收录的话,也是个大工程啊,而且弄出来,估计js文件应该都有1M左右了...
  • 打赏
  • 举报
回复
不好意思,好久没看那个程序,完全记错了.刚才看了下,在里面的编码,其实也是按照部首来的.只不过有"按照拼音分类"这么一个选项.而这个选项的结果,也十分不准确.就如楼主所说的那样.
不过,拼音表汉字集,也很常见,我们经常用它来搜索查找拼音.我想你所说的,就可能是基于此.
  • 打赏
  • 举报
回复
说错了,看CHARMAP还真容易反倒产生误解,里面是按部首排的,但其实你仔细看,表面上相邻的两个汉字的编码,却不是相邻的.汉字的编码,还是按照拼音排的.至于其它有些编码标准,则如早期的区位码一样,是按部首.这都是较早期的标准.
  • 打赏
  • 举报
回复
你没用过charmap这个系统内置工具吗.
看看里面的汉字集就知道了.IE,FF可没闲工夫另外专整一套,不过如此而已.

87,921

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧