String.Compare và Vấn đề Bảng Chữ cái Tiếng Việt

Ví dụ nếu mình viết thế này:

    CultureInfo culture = new CultureInfo("vi-VN");
    var rs = string.Compare("CH", "CO", true, culture);

thì rs = 1, => CH đi sau CO
Như vậy, bảng chữ cái của CultureInfo(“vi-VN”) là “A, Ă, Â, B, C, CH, D, Đ…” (Coi phụ âm kép và phụ âm ba là 1 ký tự) ??
Nếu mình viết là:

    CultureInfo culture = new CultureInfo("en-EN");
    var rs = string.Compare("CH", "CO", true, culture);

thì rs == -1, => CH đi trước CO
Xin hỏi mọi người nếu mình muốn sắp xếp các chuỗi Tiếng Việt theo trật tự từ điển thì nên làm thế nào cho hợp lý ? :sweat:

1 Like

lạ vậy, có lẽ C# coi “ch” là 1 ký tự à??

Giống cái bảng chữ cái ở đây á: http://www.vietnamtudien.org/chunom-trichdan/

chuẩn Unicode đâu có vụ này phải ko? Khổ ông Microsoft quá :joy:

Nếu đổi sang en-EN hoặc Invariant thì có vẻ là sắp theo kí tự đơn, nhưng chữ Â lại đi trước chữ Ă :frowning:

CultureInfo culture = new CultureInfo("en-EN");
var test = new List<string> { "CO", "CH", "D", "Đ", "A", "Ă", "Â", "B", "Ê", "E", "Ơ", "Ô" };
test.Sort((left, right) => {
   return string.Compare(left, right, true, culture);
});

đắng quá, đem lên StackOverflow hỏi thử xem

UTF-16 dựng sẵn thì ‘Â’ = U+00C2; ‘Ă’ = U+0102 => ‘Â’ trước ‘Ă’ =))

Tiện thể lướt web lung tung thì thấy cái này: http://archives.miloush.net/michkap/archive/2005/08/27/457224.html

Và cái này, đúng luôn câu hỏi của thớt:


=> Lỗi do “người ta”

3 Likes

từ tháng 3 / 2008 tới nay là 9 năm mà mấy ông Microsoft vẫn ko chịu theo chuẩn :joy:

Mình mới thử trên .NET 4.6.2 và vẫn thế , hẳn là phải tự làm Comparer rồi. :joy:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?