2014-12-10 16 views
9

Tôi hiện đang viết lại (một phần) chức năng printf() cho một dự án trường học. Nhìn chung, chúng tôi đã được yêu cầu để tạo lại hành vi của các chức năng với nhiều cờ, chuyển đổi, bổ chiều dài ...Hiểu và viết wchar_t trong C

Điều duy nhất tôi đã phải làm và điều đó khiến tôi gặp khó khăn là những lá cờ %C/%S (hoặc %lc/%ls).

Cho đến nay, tôi đã thu thập rằng wchar_t là loại có thể lưu trữ ký tự trên nhiều byte, để chấp nhận nhiều ký tự hoặc ký hiệu hơn và do đó tương thích với mọi ngôn ngữ, bất kể bảng chữ cái và đặc biệt nhân vật.

Tuy nhiên, tôi không thể tìm thấy bất kỳ thông tin cụ thể nào về máy wchar trông giống như máy, độ dài thực tế (có vẻ khác nhau dựa trên một số yếu tố bao gồm trình biên dịch, HĐH ...) hoặc cách thực sự viết chúng.

Cảm ơn bạn trước

Lưu ý rằng chúng tôi bị giới hạn trong các chức năng mà chúng tôi được phép sử dụng. Các chức năng được phép duy nhất là write(), malloc(), free()exit(). Chúng tôi phải tự mình có thể tự viết mã cho bất kỳ chức năng nào khác.

Tóm lại, những gì tôi hỏi ở đây là một số thông tin về cách diễn giải và viết "thủ công" bất kỳ ký tự nào wchar_t, với càng ít mã càng tốt để tôi có thể hiểu toàn bộ quá trình và mã hóa nó riêng tôi.

+0

Tôi sẽ bắt đầu bằng cách thu hẹp những gì 'wchar_t' có thể có nghĩa là trong tình huống của bạn. Trên hầu hết các hệ thống * nix, điều này có nghĩa là UTF-32. Trên Windows, nó có nghĩa là UTF-16. Sau đó bạn cần phải quyết định những gì thu hẹp 'char' của bạn là có được. Trên hầu hết các hệ thống * nix, nó có nghĩa là UTF-8. Tin tốt là việc chuyển đổi giữa các biểu diễn Unicode được xác định rất rõ. – Mgetz

+0

'sizeof (wchar_t)' vẫn hoạt động, phải không? – Kninnug

+0

@Kninnug - Nó hoạt động và trả về 4 byte. – kRYOoX

Trả lời

3

Một wchar_t tương tự như một char theo nghĩa là nó là một số, nhưng khi hiển thị một char hoặc wchar_t chúng ta không muốn thấy số, nhưng ký tự được vẽ tương ứng với số đó. Ánh xạ từ số tới các ký tự không được định nghĩa bởi cả char lẫn wchar_t, chúng phụ thuộc vào hệ thống. Vì vậy, không có sự khác biệt trong việc sử dụng cuối cùng giữa char và wchar_t ngoại trừ kích thước của chúng.

Đưa ra ở trên, việc thực hiện tầm thường nhất của printf ("% ls") là nơi bạn biết mã hóa hệ thống để sử dụng với char và wchar_t là gì. Ví dụ, trong hệ thống của tôi, char có 8 bit, đã mã hóa UTF-8, trong khi wchar_t là 32 bit và có mã hóa UTF-32. Vì vậy, việc thực hiện printf chỉ chuyển đổi từ UTF-32 sang UTF-8 và xuất kết quả.

Triển khai tổng quát hơn phải hỗ trợ mã hóa khác nhau và có thể định cấu hình và có thể cần kiểm tra mã hóa hiện tại là gì. Trong trường hợp này, các hàm như wcsnrtombs() hoặc iconv() phải được sử dụng.

+0

Trên thực tế, nếu '__STDC_ISO_10646__' được định nghĩa,' wchar_t' sẽ lưu trữ các giá trị điểm mã Unicode, kể từ ngày được chỉ định trong macro đó. Xem ISO C 6.10.8.2 – ninjalj

+0

Và nếu __STDC_ISO_10646__ không được xác định, thì wchar_t không cần lưu trữ các giá trị codepoint Unicode. – hdante

+0

Điều này là khá nhiều những gì tôi đoán dựa trên nhận xét @Mgetz cho câu hỏi của tôi. Cảm ơn bạn đã xác nhận nó. Với một số đọc thêm về mã hóa Unicode và cách thao tác nó, tôi đã có thể thực hiện những gì tôi cần. – kRYOoX