30/09/2018, 16:19
Cách đếm các kí tự tiếng việt
HIện tai em đang cần đếm các kí tự tiếng việt trong đoạn văn bản. Nhưng không biết làm sao để đọc các dữ liệu có dấu.
input: “dạy nhau học”
output: chỉ cần đếm kí tự như chuỗi “day nhau hoc”
Bài liên quan
Cái này cần kiến thức về unicode. Giả sử ta đang đọc file có dấu sử dụng unicode. Sau đó em xem link này để làm.
How to count characters in a unicode string in C
Đạt không có nhiều thời gian nên đành viết vài dòng ngắn gọn thế này, bạn nào có kiến thức về unicode giúp tiếp nhé.
Cách tốt nhất là thay toàn bộ có dấu về không dấu
thay như thế nào nhỉ? mình cũng cần phải đọc kí tự tiếng việt đó mà
Ah quên mất, mình có làm trên java không biết C có đuợc không nữa.
@Rok_Hoang Ví dụ chuỗi “Dạy Nhau Học” thì có độ dài bao nhiêu byte? Hôm trước Đạt bận quá chưa có thời gian nói về cái này.
Vấn đề này là vấn đề khó trong C, có thể java đã có thư viện giải quyết sẵn? Bởi vì Unicode hay nói chính xác hơn là UTF-8 có quy tắc riêng để định nghĩa số lượng byte cho một ký tự Unicode.
Trước hết nói về lý do lịch sử, khi bảng ký tự ASCII ra đời thì các ký là ký tự tiếng Anh. Khi đó chỉ cần 1 byte, 255 ký tự, là có thể định nghĩa đầy đủ bảng ký tự.
Về sau, khi người ta cần thể hiện các ký tự của nhiều ngôn ngữ khác nhau thì họ mới dùng 2 bytes, 65534 ký tự. Rồi vấn đề lại phát sinh khi ta muốn thể hiện tiếng Trung Quốc, Nhật Bản, Hàn Quốc và nhiều loại ngôn ngữ khác nhau thì 2 bytes cũng không đủ.
Nếu chỉ là 2 bytes không đủ, cứ dùng 4 bytes sẽ đủ, 4294967295 ký tự. Nhưng bây giờ lại phát sinh một vấn đề khác, nếu sử dụng 4 bytes cho tất cả các ký tự. Thì khi viết một văn bản tiếng Anh có 10 ký tự, ta phải dùng 40 bytes thay vì 10 bytes như ban đầu.
Và từ đây UTF-8, bản mã tối ưu nhất, đã ra đời. Cách hoạt động của UTF-8 như sau:
Đối với ký tự có
Tham khảo: http://www.wikiwand.com/en/UTF-8#/Description
Khi hiểu được quy tắc của nó, ta có thể đọc một byte lên, kiểm tra các bit đầu để biết được nó là một ký tự có bao nhiêu byte. Từ đó có thể gom lại các bytes đó.
Đây là code ví dụ cách đọc và ghi Utf-8
Tham khảo: http://www.wikiwand.com/en/UTF-8#/Sample_code