So sánh chuỗi tiếng việt trong java năm 2024
Vậy nhưng nếu thử hỏi một lập trình viên sử dụng ngôn ngữ lập trình bất kỳ hãy viết một đoạn code sắp xếp những cái tên sau theo thứ tự của tiếng Việt: Show In [14]: provinces = ['Hải Dương', Kết quả thu được sẽ khá bất ngờ:In [15]: sorted(provinces) Out[15]: ['Hà Giang', 'Hà Nam', 'Hà Nội', 'Hà Tĩnh', 'Hòa Bình', 'Hưng Yên', 'Hải Dương', 'Hải Phòng', 'Hậu Giang'] Lẽ ra, thứ mà chúng ta muốn nhìn thấy phải là “Hưng Yên” đứng cuối list, khi mà chữ “ư” đứng sau tất cả các phụ âm khác. Vậy function Hãy thử xem codepoint của từng chữ cái thứ 2 trong mỗi từ: In [19]: [(s[1], ord(s[1])) for s in sorted(provinces)]
Out[19]:
[('à', 224),
('à', 224),
('à', 224),
('à', 224),
('ò', 242),
('ư', 432),
('ả', 7843),
('ả', 7843),
('ậ', 7853)]
Vậy
Vậy điều gì ảnh hưởng đến thứ tự khi sắp xếp của các chữ cái? Rõ ràng nếu theo chuẩn của người Mỹ, người ta sẽ sắp xếp như trên, nhưng trong bảng chữ cái tiếng Việt, thứ tự lại khác. Những thứ liên quan đến ngôn ngữ địa phương như vậy được biểu diễn lên máy tính bằng khái niệm “locale”. Locale là gì /ləʊˈkɑːl/
Locale không chỉ là khái niệm của riêng ngôn ngữ lập trình nào mà đòi hỏi là hỗ trợ của toàn hệ thống. Các hệ điều hành (OS) đều hỗ trợ đặt các và sử dụng locale khác nhau. Cách biểu diễn một localeMột locale thường được biểu diễn ở dạng “ngônngữ_quốcgia”:
Trên hầu hết các hệt thống UNIX (Ubuntu, OSX …), có thể liệt kê các locale đang hỗ trợ trên máy bằng lệnh In [15]: sorted(provinces) Out[15]: ['Hà Giang', 'Hà Nam', 'Hà Nội', 'Hà Tĩnh', 'Hòa Bình', 'Hưng Yên', 'Hải Dương', 'Hải Phòng', 'Hậu Giang'] 7: $ locale -a | head -n3 C C.UTF-8 en_AG $ locale -a | tail -n3 POSIX vi_VN vi_VN.utf8 Các locale có thể được cài thêm, ví dụ trên Ubuntu 16.04, locale Việt Nam không được cài sẵn, phải cài thêm package In [15]: sorted(provinces) Out[15]: ['Hà Giang', 'Hà Nam', 'Hà Nội', 'Hà Tĩnh', 'Hòa Bình', 'Hưng Yên', 'Hải Dương', 'Hải Phòng', 'Hậu Giang'] 8 để có locale vi_VN: apt-get install -y language-pack-vi Nếu có nhiều hơn một bộ ký tự cho một locale, có thể chỉ rõ ra nó ở dạng: “ngônngữ_quốcgia.bộkýtự”: Ví dụ:
Danh sách một số locale phổ biến hỗ trợ bởi GCC, hay danh sách đầy đủ của OS, hay Khi không có locale nào được set, locale mặc định là C hay POSIX. Locale categoriesĐôi khi, người ta lại muốn dùng bảng chữ cái của Việt Nam, nhưng đơn vị tiền tệ của Mỹ, thời gian theo format của Anh, những nhu cầu lẫn lộn này được đáp ứng bởi locale sẽ chia nhỏ thành “locale subcategories” và mỗi category sẽ điều chỉnh một khía cạnh của luật locale:
Thứ tự xử lý localeCác locale category thường được set làm biến môi trường.
Theo http://manpages.ubuntu.com/manpages/xenial/en/man1/locale.1posix.html Set/get locale trên PythonChú ý: bài viết thực hiện trên Ubuntu, trên Windows 10 dùng In [19]: [(s[1], ord(s[1])) for s in sorted(provinces)] Out[19]: [('à', 224), ('à', 224), ('à', 224), ('à', 224), ('ò', 242), ('ư', 432), ('ả', 7843), ('ả', 7843), ('ậ', 7853)] 3 thay vì In [15]: sorted(provinces) Out[15]: ['Hà Giang', 'Hà Nam', 'Hà Nội', 'Hà Tĩnh', 'Hòa Bình', 'Hưng Yên', 'Hải Dương', 'Hải Phòng', 'Hậu Giang'] 6 In [1]: import locale In [3]: locale.getlocale(category=locale.LC_CTYPE) # LC_TYPE là category mặc định Out[3]: ('en_US', 'UTF-8') In [4]: locale.getlocale() Out[4]: ('en_US', 'UTF-8') In [5]: locale.setlocale(locale.LC_ALL, 'vi_VN') Error Traceback (most recent call last)
Do máy không có locale vi_VNset locale cho tất cả category sử dụng giá trị mặc định (thường lấy trong biến môi trường LANG)In [6]: locale.setlocale(locale.LC_ALL, '') Out[6]: 'en_US.UTF-8' Trả về database của các convention hiện tạiIn [7]: locale.localeconv() Out[7]: {'currency_symbol': '$', 'decimal_point': '.', 'frac_digits': 2, 'grouping': [3, 3, 0], 'int_curr_symbol': 'USD ', 'int_frac_digits': 2, 'mon_decimal_point': '.', 'mon_grouping': [3, 3, 0], 'mon_thousands_sep': ',', 'n_cs_precedes': 1, 'n_sep_by_space': 0, 'n_sign_posn': 1, 'negative_sign': '-', 'p_cs_precedes': 1, 'p_sep_by_space': 0, 'p_sign_posn': 1, 'positive_sign': '', 'thousands_sep': ','} Đổi locale sang C, ở locale này không có đơn vị tiền tệ.In [15]: locale.setlocale(locale.LC_ALL, 'C'); locale.localeconv()['currency_symbol'] Out[15]: '' Khi đổi lại về locale default (thường lấy từ LANG), ở đây là en_US.UTF8, ký hiệu đơn vị tiền tệ là $.In [16]: locale.setlocale(locale.LC_ALL, ''); locale.localeconv()['currency_symbol'] Out[16]: '$' Trên một máy có locale vi_VN, có thể thay đổi và xem đơn vị tiền tệ: In [2]: locale.setlocale(locale.LC_ALL, 'vi_VN') Out[2]: 'vi_VN' In [3]: locale.localeconv() Out[3]: {'currency_symbol': '₫', 'decimal_point': ',', 'frac_digits': 0, 'grouping': [3, 3, 0], 'int_curr_symbol': 'VND ', 'int_frac_digits': 0, 'mon_decimal_point': ',', 'mon_grouping': [3, 3, 0], 'mon_thousands_sep': '.', 'n_cs_precedes': 1, 'n_sep_by_space': 0, 'n_sign_posn': 1, 'negative_sign': '-', 'p_cs_precedes': 0, 'p_sep_by_space': 0, 'p_sign_posn': 1, 'positive_sign': '', 'thousands_sep': '.'} Chú ý việc set này chỉ có tác dụng tại phiên làm việc hiện thời. Để thay đổi locale của toàn hệ thống (Ubuntu), phải thay đổi trong In [19]: [(s[1], ord(s[1])) for s in sorted(provinces)] Out[19]: [('à', 224), ('à', 224), ('à', 224), ('à', 224), ('ò', 242), ('ư', 432), ('ả', 7843), ('ả', 7843), ('ậ', 7853)] 5 root@hvn:~# cat /etc/default/locale LANG="en_US.UTF-8" rồi chạy In [19]: [(s[1], ord(s[1])) for s in sorted(provinces)] Out[19]: [('à', 224), ('à', 224), ('à', 224), ('à', 224), ('ò', 242), ('ư', 432), ('ả', 7843), ('ả', 7843), ('ậ', 7853)] 6. Sắp xếp string theo kiểu Việt NamNếu đã đọc đến đây và hiểu những gì viết trong bài thì bạn sẽ biết rằng thứ tự các chữ cái khi sắp xếp phụ thuộc vào locale category: In [19]: [(s[1], ord(s[1])) for s in sorted(provinces)] Out[19]: [('à', 224), ('à', 224), ('à', 224), ('à', 224), ('ò', 242), ('ư', 432), ('ả', 7843), ('ả', 7843), ('ậ', 7853)] 7 |