Gần đây, có người hỏi về số algorithm for reversing a string in place in C. Hầu hết các giải pháp được đề xuất đều gặp sự cố khi xử lý các chuỗi không phải byte đơn. Vì vậy, tôi đã tự hỏi những gì có thể là một thuật toán tốt để đối phó cụ thể với các chuỗi utf-8.Làm cách nào để đảo ngược chuỗi UTF-8 tại chỗ?
Tôi đã đưa ra một số mã mà tôi đăng tải dưới dạng câu trả lời nhưng tôi rất vui khi thấy ý tưởng hoặc đề xuất của người khác. Tôi thích sử dụng mã thực, vì vậy tôi đã chọn C#, vì nó có vẻ là một trong những ngôn ngữ phổ biến nhất trong trang web này, nhưng tôi không ngại nếu mã của bạn có ngôn ngữ khác, miễn là nó có thể hợp lý được hiểu bởi bất kỳ ai quen thuộc với ngôn ngữ bắt buộc. Và, vì điều này được dự định để xem làm thế nào một thuật toán có thể được thực hiện ở mức độ thấp (bởi mức độ thấp, tôi chỉ có nghĩa là giao dịch với byte), ý tưởng là để tránh sử dụng thư viện cho mã lõi.
Ghi chú:
Tôi quan tâm đến các thuật toán riêng của mình, hiệu quả của nó và làm thế nào nó có thể được tối ưu hóa (Tôi có nghĩa là tối ưu hóa thuật toán cấp, chứ không phải thay thế i ++ với ++ i và đó; Tôi cũng không thực sự quan tâm đến điểm chuẩn thực tế).
Tôi không có ý định sử dụng nó trong mã sản xuất hoặc "phát minh lại bánh xe". Đây chỉ là sự tò mò và tập thể dục.
Tôi đang sử dụng mảng C# byte vì vậy tôi giả sử bạn có thể nhận được độ dài của chuỗi mà không cần chạy mặc dù chuỗi cho đến khi bạn tìm thấy NUL. Tức là, tôi không tính toán độ phức tạp của việc tìm độ dài của chuỗi. Nhưng nếu bạn đang sử dụng C, ví dụ, bạn có thể yếu tố đó bằng cách sử dụng strlen() trước khi gọi mã lõi.
Edit:
Như Mike F chỉ ra, mã của tôi (và mã số của người khác được đăng ở đây) không được đối phó với các nhân vật composite. Một số thông tin về những số here. Tôi không quen với khái niệm này, nhưng nếu điều đó có nghĩa là có "các ký tự kết hợp", nghĩa là các ký tự/điểm mã chỉ hợp lệ với các ký tự/điểm mã "cơ sở" khác, bảng tra cứu của ký tự có thể được sử dụng để bảo vệ thứ tự của ký tự "toàn cầu" ("cơ sở" + "kết hợp" ký tự) khi đảo ngược.
Đây là một câu hỏi thú vị, nhưng để * hữu ích * đảo ngược chuỗi Unicode (UTF8 hoặc cách khác), bạn phải lo lắng về việc bảo vệ thứ tự của các ký tự kết hợp cũng như tung các byte. –
Cảm ơn những người đứng đầu. Tôi đã không nhận thức được các nhân vật tổng hợp. Tôi sẽ xem xét điều đó trước. –