django页面中按照汉语拼音排序


需求要将页面上的部门按照中文顺序排列,做法可以分为三种:
* 数据库取出来的时候排序
* 取出来后使用python排序
* 前端渲染后使用js排序

1. 数据库取出来的时候排序:

raw_sql = "SELECT * from auth_group where id <> -1 order by CONVERT(name USING gbk)"
rels = Group.objects.raw(raw_sql)

使用django中的原生sql方式(一般的常用汉字的排序)

mysql数据库如果采用utf8字符集,中文不能直接按照拼音排序,需要’USING gbk’对字段进行转码,输出的时候按照拼音从A到Z进行升序排列,如果字段本身设置是GBK格式就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字3755个采用拼音排序),直接在查询语句后面 添加 order by name asc; 查询结果按照姓氏的升序排序;

2.python排序

python可以在list中进行默认的sort做排序操作,但如果是不常用字(二级汉字)将不适用,如果做到较为精确排序,可以参考下面文章,作者自己提取了一份汉字编码表,导入编码表做查询即可。

参考文章:http://gerry.lamost.org/blog/?p=338

我找到最全的数据是slowwind9999上传到csdn的unicode汉字编码表,包括全部20902个汉字的全拼、五笔、郑码、UNICODE、GBK、笔画数 部首,以及笔顺编号(拼音部分没有音调,而且个别注音有误,
如 囍,猤,啹等字,使用需注意。)

我提取了其中的笔顺数据,又用江志键的“实用汉字转拼音”程序制作了unicode汉字音调版,其中中文汉字用四声标注,

319个日韩汉字没有音调以示区别,并根据汉典的数据略作修正(但仍可能存在错误)。有了这两个对照表,下面的工作就简单了。

3.js排序

JavaScript提供了一种更简便的方法用于比较两个字符串——localeCompare(),localeCompare()使用本地特定的顺序来比较两个字符串

语法如下:
string.localeCompare(target) 参数target是要与string进行比较的字符串。
* 如果string小于target,则localeCompare()返回小于0的数;
* 如果string大于target,返回大于0的数;
* 如果相等(或按照本地顺序的约定两者顺序相当),则返回0。
利用该方法替换上面冗长的作法后,除了代码减少了之外,运行速度也快了不少,而且还支持其它字符库的本地排序。

修改后代码如下:

function startSort(){
var array = ['张彬','王五','李四','张三'];
array.sort(function(a,b){return a.localeCompare(b)});
console.info(array);
};
startSort();

github也上有汉字注音、排序的工具:

  • 根据词组智能匹配最正确的拼音。
  • 支持多音字。
  • 简单的繁体支持。
  • 支持多种不同拼音风格。

js版:https://github.com/hotoo/pinyin

python版:https://github.com/mozillazg/python-pinyin

另一个汉字转拼音的python工具:https://github.com/cleverdeng/pinyin.py

Example:

from pinyin import PinYin

test = PinYin()
test.load_word()
test.hanzi2pinyin(string='钓鱼岛是中国的')
Out:

test.hanzi2pinyin(string='钓鱼岛是中国的')
['diao', 'yu', 'dao', 'shi', 'zhong', 'guo', 'de']
test.hanzi2pinyin_split(string='钓鱼岛是中国的', split="-")
diao-yu-dao-shi-zhong-guo-de

Written by

说点什么

欢迎讨论

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒