2009-07-12 50 views
13

Tôi hiện đang khám phá đặc tả của ngôn ngữ Digital Mars D và có một chút rắc rối khi hiểu được bản chất hoàn chỉnh của các loại ký tự nguyên thủy. Cuốn sách Learn to Tango With D tương tự như mơ hồ về khả năng và hạn chế của ngôn ngữ trong khu vực này.Những hạn chế của các loại ký tự nguyên thủy trong D là gì?

Các loại được đưa ra trên the website như:

 
char; // unsinged 8 bit UTF-8 
wchar; // unsigned 16 bit UTF-16 
dchar; // unsigned 32 bit UTF-32 

Kể từ khi chúng ta biết rằng hầu hết các chuyển đổi Unicode (UTF) mã hóa Format đại diện cho nhân vật với một chút chiều rộng thay đổi, điều này có nghĩa là một char trong D chỉ có thể chứa các giá trị sẽ phù hợp với 8 bit, hoặc nó có mở rộng trong bộ nhớ vật lý của máy khi bạn cung cấp cho nó các ký tự byte kép không? Có lẽ có một số khả năng khác, như đúc tự động vào loại tiếp theo thích hợp nhất khi bạn quá tải biến?

Ví dụ: tôi muốn sử dụng thẻ UTF-8 trong trình chỉnh sửa và nhập bằng tiếng Trung. Nó sẽ chỉ đơn giản là rơi qua, hoặc là nó có thể đối phó với các ký tự Unicode hơn 'chính xác', như trong C#? Nó vẫn còn cần thiết để cung cấp mã keo để cho phép làm việc với bất kỳ ngôn ngữ được hỗ trợ bởi Unicode?

Tôi đánh giá cao bất kỳ thông tin cụ thể nào mà bạn có thể cung cấp về cách các loại này hoạt động dưới danh sách và bất kỳ lời khuyên thực tiễn tốt nhất chung nào về việc xử lý giới hạn của chúng.

+0

"Kể từ khi chúng ta biết rằng các tiêu chuẩn Unicode đại diện cho nhân vật với một chút-width biến "-> bạn có nghĩa là utf8? – elcuco

+0

Vâng, ý tôi là mã hóa UFT. Xin lỗi vì sự nhầm lẫn. – IanGilham

Trả lời

15

Một đơn char hoặc wchar đại diện cho UTF code unit. Điều này có nghĩa rằng, bằng chính nó, một char có thể biểu diễn một biểu tượng ASCII (0-127) hoặc là một phần của chuỗi UTF-8 biểu diễn một ký tự Unicode (code point). Chỉ có loại dchar có thể đại diện cho toàn bộ ký tự Unicode, bởi vì có hơn 65536 điểm mã trong Unicode.

Đúc một loại loại chuỗi (string, wstringdstring, mảng đơn giản là động của các loại ký tự) sẽ không tự động chuyển đổi nội dung của chúng sang biểu diễn UTF tương ứng. Để thực hiện việc này, bạn phải sử dụng các chức năng toUTF8, toUTF16toUTF32 từ std.utf (hoặc toString/toString16/toString32 từ tango.text.convert.Utf nếu bạn sử dụng Tango).

Người dùng đã triển khai các lớp chuỗi sẽ tự động sử dụng đại diện hiệu quả nhất của bộ nhớ có thể ánh xạ từng ký tự vào một đơn vị mã đơn lẻ. Điều này cho phép cắt và lập chỉ mục nhanh chóng với chi phí bộ nhớ tối thiểu. Một triển khai như vậy là mtext bởi Christopher E. Miller.

Đọc thêm:

+2

Có vẻ như, vấn đề của tôi là hiểu được sự khác biệt giữa các đơn vị mã và các điểm mã. Liên kết cuối cùng giải thích mọi thứ rất độc đáo. Cảm ơn. – IanGilham

+0

Ditto về việc bổ sung cho văn bản của ông Keep. – BCS

+1

Tôi rất vui khi biết bài viết đã giúp bạn. Tuy nhiên, hãy nguyền rủa bạn, CyberShadow, để trả lời câu hỏi này trước khi tôi đến đây! : P –

Các vấn đề liên quan