1
7
首先,您的数据库排序规则是什么?我想是
看起来像是在写 真 Unicode分拣机是一项重要的工作。我见过比规范更简单的税务代码。;-)它似乎总是涉及到查找表和至少三级排序——通过修改字符和收缩来解释。 我将以下内容限制在 Latin 1 , Latin Extended-A 和 Latin Extended-B 表/排序规则。算法应该可以很好地处理这些集合,但是我没有完全测试它,也没有正确地考虑修改字符(为了节省速度和复杂性)。 看到它 in action at jsbin.com . 功能:
测试:
结果:
|
2
3
@brockadams'answer 很好,但我在字符串中间有一些边缘大小写,连字符与SQL Server不匹配,我无法很好地找出哪里出错,因此我编写了一个更实用的版本,只过滤掉被忽略的字符,然后比较基于拉丁代码点的数组。 它的性能可能较低,但要理解的代码较少,而且它可以在匹配我在下面添加的SQL测试用例上工作。
我使用的SQL Server数据库带有
这两个排序与我的测试用例在排序上没有区别。
/**
*这是SortByroughSQL拉丁语1_General_cp1_cs_as的修改版本
*这有一个更实用的方法,它更基本
*它只做一个字符过滤然后排序
*@链接https://stackoverflow.com/a/3266430/327074
*
*@参数字符串a
*@参数字符串b
*@返回数字-1,0,1
*/
函数latinsqlsort(a,b){
“使用严格”;
//--这是Latin1代码点的主查找表。
//这里通过扩展集\u02af
变量拉丁查找=[
-1151152153154155156157158,2,3,4,5,6159160161162163164,
165166167168169170171172173174175176,0,7,8,9,10,11,12210,
13,14,15,41,16211,17,18,65,69,71,74,76,77,80,81,82,83,19,20,
42、43、44、21、2221422572662843308347352376387419427438459466486,
5295345385576595636641647650661、23、24、25、26、27、28213255265,
28330734635635037435418426436458464485528533536558575594635640,
646648660、29、30、31、32177178179181182183184185186188189,
190191192193194195196197198199200201202203204205207208209,
1,33,53,54,55,56,34,57,35,58215,46,59212,60,36,61,45,72,75,
37、62、63、64、38、70487、47、66、67、68、3921921722123122323350276,
312310316318392390395397295472491489493503495,48511599597601,
60365250957321821622023022223249275311309315317391389394396,
294471490488492502494、49510598596600602651589655229228227226,
23523426826727227127026927427732862852902873243233221314313,
326325320319358357362361356355364363378377380379405404403402,
401400407406393388416421420432431428443944744644434442,
441450449468467474473470469477484483501500499498507506527526,
5405395445435425415605635632567566565564580579578577593592,
61161060960860706066136126176166156164362654653656663662665,
66466766657425822602622612642628127827827730429228928829735337,
3323483483493693713824154094344334484451462479509521524523,
531530552572571569570583582581585635632631634638658657669668673,
6776678,73,79,78680644,50,51,52,40303302301457456455482481,
480225224398497496605604626625620619624623622621334241240,
237236254536365360359430429505550555146775674422300298,
354353、84、85、86、872392382525135122432422452432832730329,
411410413412517516519518547546549548627630629、88、89、90、91、
92、93、94、95、96、97、98、9910010110203104105106107108109110111,
11211311411511611711811911201211221231241251261728129130131,
13213313413513613713813914014114214321432462447248259279228029329291,
3393363383331340341342433673351370372383381384408414386445,
453452454461463460475478465508550852553253250553554555545556557,
53755156833424343344586584618633637639645659649670672679,
6816826832826862563453683754254354337535684684685305296306591587,
588144145146147148149150
;
/**
*对于主排序权重,将忽略一组字符。
*最重要的是连字符和撇号字符。
*一堆控制字符和一些零碎的东西,组成
*其余的。
*
*@参数数字
*@返回布尔值
*@链接https://stackoverflow.com/a/3266430/327074
*/
函数ignoreforimarysort(icharcode){
如果(ICharcode<9){
回归真实;
}
如果(icharcode>=14&icharcode<=31){
回归真实;
}
如果(icharcode>=127&icharcode<=159){
回归真实;
}
如果(icharcode==39 icharcode==45 icharcode==173){
回归真实;
}
返回错误;
}
/ /正规排序
功能比较(A,B){
如果(a==B){
返回0;
}
返回A>B?1∶1;
}
//比较两个数组返回第一个比较差
函数数组(a,b){
返回a.reduce(函数(acc,x,i){
返回acc==0&i<b.长度?比较(x,b[i]):acc;
},0);
}
/**
*将字符串转换为拉丁码位顺序数组
*@参数字符串x
*@返回数组整数数组
*/
函数tolatinor(x){
返回x.split(“”)
//转换为字符代码
.map(函数(x)返回x.charcodeat(0);)
//筛选出忽略的字符
.filter(函数(x)返回!忽略PrimarySort(x);)
//转换为拉丁顺序
.map(函数(x)返回LatinLookup[x];);
}
//转换输入
var chara=托拉廷阶(a)
charb=托拉廷阶(b);
//比较数组
var charscompare=arraycompare(chara,charb);
如果(charscompare!==0){
返回CharsCompare;
}
//回退到筛选后的数组长度
var charslencompare=比较(chara.length,charb.length);
如果(charslencompare!==0){
返回charslencompare;
}
//最后回退到基本长度比较
返回比较(a.长度,b.长度);
}
VAR测试=
“格雷斯发现”
'展览参观者',
'展览参观者',
“展览参观者”,
'已接收的呼叫',
“xhibit访客”,
'分发的手册',
“展览参观者”,
“垃圾袋”,
'^&$grails found',
“?测试,
“612C-520”,
“612 C-122”
‘612C-122’,
“612 C-126 L”,
612C301B',
612C304 B′,
“612C306”,
“612 C306”,
“612 C306 2”
612 C-403 h,
“612C403 O”
612C-403(V)
'612E-306A/B I',
'612E-306A/B O',
‘612C-121’,
“612C-111”,
'-612C-111b′
.sort(拉丁SQL排序).join('<br>');
document.write(tests);
|
3
2
抱歉,javascript没有排序规则功能。您得到的唯一字符串比较是直接使用
对于基本多语言平面内的字符,这与二进制排序规则相同,因此,如果需要JS和SQL Server同意(不管怎样,忽略星状平面),我认为这是唯一的方法。(总之,除了在JS中构建一个字符串排序器和仔细复制SQL Server的排序规则之外。那里没有什么乐趣。) (什么是用例,为什么需要匹配?) |
M - · 为什么两个相同的表情符号不相等? 2 年前 |
Mohsen · 将字符串从Windows 1256转换为UTF-8 6 年前 |
AMINA ARSHAD · 从字符转换为Unicode数字时出错 6 年前 |
Taqwa · 在C#[已关闭]中将上标转换为Unicode 6 年前 |