การเรียงลำดับภาษาจีนโดยพินอินใน Javascript ด้วย localeCompare?

ฉันกำลังเผชิญกับความท้าทายที่นี่ ฉันจะเรียงลำดับ "สำนวน" ภาษาจีนบางรายการด้วยพินอิน

คำถาม:
ฉันจะจัดเรียงตามพินอินใน Firefox ได้อย่างไร
มีวิธีจัดเรียงอย่างถูกต้องใน IE 9 และ 10 หรือไม่ (พวกเขายังต้องได้รับการสนับสนุนจากเว็บไซต์)

ตัวอย่าง:

  1. 财经传讯公司
  2. 财经顾问
  3. 房地产及按揭

จากข้อมูลของหน่วยงานแปล นี่คือสิ่งที่ควรเรียงลำดับของคำ คำแปลมีดังนี้:

  1. หน่วยงานสื่อสารทางการเงิน
  2. ที่ปรึกษาทางการเงิน
  3. อสังหาริมทรัพย์และการจำนอง

การออกเสียงในอักษรละติน:

  1. ไช่ จิง ฉวน ซุน กง สี
  2. ไช่ จิง กู เหวิน
  3. ฟาง ดี ชาน จี อัน จี

String.localeCompare: เอกสาร MDN

จากสิ่งที่ฉันเข้าใจฉันจะให้อาร์กิวเมนต์ที่ 2 กับวิธี String.localeCompare ที่ "บอก" วิธีการเรียงลำดับตามพินอินในรูปแบบ BCP 47 ซึ่งควรเป็น zh-CN-u-co-pinyin

ดังนั้นโค้ดเต็มควรมีลักษณะดังนี้:

var arr = [ "财经传讯公司", "财经顾问", "房地产及按揭"];
console.dir(arr.sort(function(a, b){
    return a.localeCompare(b, [ "zh-CN-u-co-pinyin" ]); 
}));

ตัวอย่างการทำงานของ jsFiddle

ฉันคาดว่าสิ่งนี้จะบันทึกเพื่อคอนโซลนิพจน์ตามลำดับที่ฉันป้อนในอาร์เรย์ แต่ผลลัพธ์แตกต่างออกไป

ใน FX 27 ลำดับคือ: 3, 1, 2
ใน Chrome 33: 1, 2, 3
ใน IE 11: 1, 2, 3

หมายเหตุ:

พินอินเป็นระบบการออกเสียงอย่างเป็นทางการสำหรับการถอดเสียงการออกเสียงภาษาจีนกลางของตัวอักษรจีนให้เป็นอักษรละติน


person Daniel V.    schedule 07.04.2014    source แหล่งที่มา
comment
ฉันไม่คาดหวังว่า localeCompare() จะทับศัพท์เป็นพินอิน สิ่งที่ฉันคาดหวังคือมันจะทำการเปรียบเทียบโดยสมมติว่าข้อความอินพุตเป็นพินอิน BTW รองรับ FF เริ่มตั้งแต่ 29 (ดังนั้นจึงใช้ไม่ได้ใน 27)   -  person Adriano Repetti    schedule 07.04.2014
comment
อย่างแท้จริง! ฉันพลาดตารางความเข้ากันได้ ฉันคุ้นเคยกับ FX ที่มีคุณสมบัติบน MDN มากเกินไป :) ความผิดพลาดของ Naiv   -  person Daniel V.    schedule 07.04.2014
comment
นี่คือเอกสาร localCompare MDC developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/   -  person sharkbait    schedule 07.04.2014


คำตอบ (4)


สิ่งนี้ใช้ได้กับ Chrome:

const arr = ["博","啊","吃","世","中","超"]
arr.sort((x,y)=>x.localeCompare(y, 'zh-CN'))
person soulmachine    schedule 17.01.2017

โดยทั่วไป ผู้คนจะใช้วิธีต่อไปนี้ในการเรียงลำดับพินอินของตัวอักษรจีน

var list=[' king ', 'a', 'li'];  
list.Sort(function (a, b) {return a.localeCompare(b); });

localeCompare () : มีลำดับเฉพาะท้องถิ่นเพื่อเปรียบเทียบสองสตริง

วิธีการเรียงลำดับพินอินนี้ไม่น่าเชื่อถือ

วิธีที่สอง: ขึ้นอยู่กับระบบปฏิบัติการจีนเป็นอย่างมาก

ขึ้นอยู่กับเคอร์เนลของเบราว์เซอร์อย่างมาก กล่าวคือ หากผู้เยี่ยมชมไซต์ของคุณใช้ระบบภาษาจีนหรือเบราว์เซอร์ Internet Explorer (Chrome) เขาอาจจะไม่สามารถเห็นพินอินเรียงลำดับผลลัพธ์ที่เราคาดหวังได้

ที่นี่ฉันจะแนะนำวิธีแก้ปัญหาของฉันสำหรับปัญหานี้ หวังว่าจะได้มาด้วยวิธีใดวิธีหนึ่ง: วิธีนี้รองรับชุดอักขระ Unicode x4e00 จาก 0 ถึง 0 x9fa5 พื้นที่ทั้งหมด 20902 ติดต่อกันจากจีน (รวมถึงไต้หวัน) ญี่ปุ่น เกาหลีใต้ ตัวอักษรจีน ได้แก่ ตัวอักษร CJK (จีน ญี่ปุ่น เกาหลี)

var CompareStrings={.........}
getOrderedUnicode: function (char) {
var originalUnicode=char.charCodeAt (); 
if (originalUnicode >=0 x4e00 && originalUnicode <=0 x9fa5) {
var index=this.Db.IndexOf (char); 
if (index >1) {
return index + 0 x4e00; 

}} 
return originalUnicode; 
}, 


compare: function (a, b) {
if (a==b) {return 0; }

//here can be rewritten according to the specific needs and the writing is the empty string at the bottom the if (a.length==0) {return 1; } 

if (b.length==0) {return - 1; } 
var count=a.length >B.length? B.length: a.length; 

for (var i=0; i<count; i++) {
var au=this.GetOrderedUnicode (a [i]); 
var bu=this.GetOrderedUnicode [i] (b); 
if (au >bu) {
return 1; 
} else if (au <bu) {
return - 1; 
}} 

return a.length >B.length? 1:1; 

}} 
//rewriting system native localeCompare 

ต้นแบบ:

LocaleCompare = function (param) {
    return CompareStrings.compare said (enclosing the toString (), param); 
} 

คุณสามารถใช้ลิงก์ด้านล่างเพื่อดาวน์โหลดโค้ดที่สมบูรณ์

การแนะนำหลักการดำเนินการโดยย่อ:

  1. ตามพินอินเรียงลำดับอักขระที่ดี (db) : มีหลายวิธีในการบรรลุเป้าหมาย ฉันเสร็จแล้วด้วยการรวม JavaScript + c# ใช้สคริปต์ก่อนอื่นให้ใส่การแจงนับตัวอักษรจีนทั้งหมดแล้วส่งไปที่การเรียงลำดับพื้นหลัง c #good และส่งออกไปที่แผนกต้อนรับ นี่เป็นเพียงการเตรียมการ สิ่งที่ทุกคนสามารถทำได้

  2. ระบุตัวอักษรสองตัวที่ใหญ่กว่า (getOrderedUnicode) : เพราะในการสั่งซื้อไม่ใช่แค่จัดการกับตัวอักษรจีนและตัวอักษรจีนนอกตัวอักษรดังนั้นผู้เปรียบเทียบจะต้องสามารถระบุตัวอักษรทั้งหมดได้เราที่นี่ด้วยการตัดสินว่าตัวอักษร คือการเลือกปฏิบัติตัวอักษรจีน: ถ้าเป็นตัวอักษรจีนแล้วดัชนีการค้นหาไลบรารีการเรียงลำดับคำที่ดีค่าดัชนีบวกอักขระ Unicode ตั้งค่าตำแหน่งของตัวอักษรจีนตัวแรกอยู่หลัง "การปรับเทียบ" ของชุดอักขระ Unicode ของ ค่าดัชนี; หากไม่ใช่อักขระจีน ให้ส่งคืนโดยตรงบนค่าดัชนีของชุดอักขระ Unicode

  3. เปรียบเทียบสองสตริง (เปรียบเทียบ) : โดยการเปรียบเทียบอักขระแต่ละตัวสองตัว (ภายในการเปรียบเทียบช่วงที่มีประสิทธิภาพ นั่นคือ ยิ่งความยาวของสตริงสั้นลง) หากคุณพบค่าที่มากกว่า b จะส่งคืนค่า 1 และส่งคืน 1 รอง

  4. ภายในช่วงที่มีผลหลังการเปรียบเทียบ ถ้ายังไม่เสมอกัน ให้ดูว่าใครยาวกว่า เช่น a='123', b='1234' ให้ยาว b ไปทางด้านหลัง

แก้ไข

คุณยังสามารถใช้ปลั๊กอิน JQuery ได้:

jQuery.extend( jQuery.fn.dataTableExt.oSort, {
    "chinese-string-asc" : function (s1, s2) {
        return s1.localeCompare(s2);
    },
    "chinese-string-desc" : function (s1, s2) {
        return s2.localeCompare(s1);
    }
} );

ดูโพสต์ต้นฉบับ

person sharkbait    schedule 07.04.2014
comment
วิธีการเรียงลำดับพินอินนี้ไม่น่าเชื่อถือ สมมติว่าข้อความที่ป้อนพินอิน (ดังตัวอย่างของคุณ) คุณอธิบายได้ไหมว่าทำไมจึงไม่น่าเชื่อถือ (แน่นอนสำหรับเบราว์เซอร์ที่รองรับ) - person Adriano Repetti; 07.04.2014
comment
วิธีการนี้เชื่อมโยงกับประเภทของเบราว์เซอร์ที่ผู้ใช้หรือระบบปฏิบัติการที่ทำงานบนเครื่องมากเกินไป - person sharkbait; 07.04.2014
comment
คุณสามารถดูได้ที่นี่ datatables.net/forums/discussion/9700/ หมายเหตุบางส่วนเกี่ยวกับ localCompare และ IE9 เป็นต้น.... - person sharkbait; 07.04.2014
comment
สมมติว่าการสนับสนุนเบราว์เซอร์เชื่อถือได้ และไม่เกี่ยวข้องกับระบบปฏิบัติการพื้นฐานเลย ในการแก้ไขครั้งล่าสุด คุณได้โพสต์ตัวอย่างจากปลั๊กอินการเรียงลำดับ DataTable ซึ่งใช้งานได้ค่อนข้างดี (โปรดเพิ่มการอ้างอิงถึงผู้เขียนต้นฉบับและซอร์สโค้ด โค้ดนั้นเพียงอย่างเดียวไม่มีประโยชน์) - person Adriano Repetti; 07.04.2014
comment
ฉันอยากจะพูดว่าเบราว์เซอร์สำหรับการสำรวจอินเทอร์เน็ตเช่น Chrome... ขอโทษสำหรับภาษาอังกฤษของฉัน - person sharkbait; 07.04.2014
comment
ยิ่งไปกว่านั้น...พจนานุกรม (!!!) อาจเป็นวิธีแก้ปัญหาได้ก็ต่อเมื่อคุณไม่สามารถใช้อย่างอื่นได้ อย่างไรก็ตาม ฉันจะเพิ่มการระบุแหล่งที่มาที่เหมาะสมให้กับผู้เขียนต้นฉบับด้วย: script-home .com/javascript-implementation-method-of-pinyin.html - person Adriano Repetti; 07.04.2014
comment
ขอโทษครับอาจารย์....ไม่คิดว่าจะเปรี้ยวไปหน่อยเหรอ?!?! ยังไงก็ตาม... ฉันแค่พยายามช่วยผู้ถามเท่านั้น.... ฉันไม่ได้มาที่นี่เพื่อแข่งขันกับคุณ... คิดในสิ่งที่คุณต้องการ.... - person sharkbait; 07.04.2014
comment
ขออภัยถ้าฉันดูเปรี้ยว การสนทนามักจะเป็นวิธีที่ดีในการปรับปรุงคำตอบ (ซึ่งจะช่วยผู้อ่านในอนาคตด้วย) และช่วยเหลือทุกคน (ทั้งฉันและฉันก็ด้วย) และคุณ) เพื่อทำความเข้าใจปัญหา ฉันรู้ว่าฉันเครียดเล็กน้อยเกี่ยวกับข้อมูลอ้างอิง แต่ก็ดีสำหรับผู้แต่งต้นฉบับ... - person Adriano Repetti; 07.04.2014

ตาม MDN, locales และ options อาร์กิวเมนต์ใน localeCompare() ได้รับการเพิ่มใน Firefox 29 แล้ว คุณควรจะสามารถเรียงลำดับตามพินอินได้แล้ว

person Xhacker Liu    schedule 11.02.2016

นี่คือวิธีแก้ปัญหา:

<!--
pinyin_dict_notone.js and pinyinUtil.js is available in URL below:
https://github.com/sxei/pinyinjs
-->
<script src="pinyin_dict_notone.js"></script>
<script src="pinyinUtil.js"></script>
<script>
jQuery.extend(jQuery.fn.dataTableExt.oSort, {
  "chinese-string-asc": function(s1, s2) {
    s1 = pinyinUtil.getPinyin(s1);
    s2 = pinyinUtil.getPinyin(s2);
    return s1.localeCompare(s2);
  },
  "chinese-string-desc": function(s1, s2) {
    s1 = pinyinUtil.getPinyin(s1);
    s2 = pinyinUtil.getPinyin(s2);
    return s2.localeCompare(s1);
  }
});
jQuery(document).ready(function() {
  jQuery('#mydatatable').dataTable({
    "columnDefs": [
      { type: 'chinese-string', targets: 0 }
    ]
  });
});
</script>
person ahgood    schedule 16.08.2017