2010-10-18 20 views
26

Có lý do nào tại sao loại dữ liệu nguyên gốc Java char là 2 byte không giống C là 1 byte?Tại sao nguyên gốc Java char chiếm 2 byte bộ nhớ?

Cảm ơn

+4

Câu trả lời ngắn gọn là vì chúng bị bẻ cong: chúng phải sử dụng các ký tự 32 bit. – tchrist

+0

Không, họ không nên sử dụng các ký tự rộng 32 bit. Điều đó sẽ làm cho chi phí còn tồi tệ hơn! – vy32

+6

@ vy32: Vâng. Họ thực sự nên sử dụng [ký tự 6 bit] (https://en.wikipedia.org/wiki/Six-bit_character_code). Điều đó sẽ tiết kiệm không gian, và sau tất cả, các chữ cái viết hoa phải đủ cho mọi người. –

Trả lời

18

char trong Java là UTF-16 mã hóa, đòi hỏi tối thiểu là 16-bit dung lượng lưu trữ cho mỗi nhân vật.

44

Khi Java được thiết kế ban đầu, nó được dự đoán rằng bất kỳ ký tự Unicode nào sẽ vừa với 2 byte (16 bit), do đó charCharacter được thiết kế tương ứng. Trong thực tế, một ký tự Unicode có thể yêu cầu lên đến 4 byte. Do đó, UTF-16, mã hóa Java bên trong, yêu cầu các ký tự bổ sung sử dụng 2 đơn vị mã. Các ký tự trong Mặt phẳng đa ngôn ngữ cơ bản (những cái phổ biến nhất) vẫn sử dụng 1. Một Java char được sử dụng cho mỗi đơn vị mã. Điều này Sun article giải thích rõ điều này.

+5

Tôi chắc rằng Joel sẽ đánh giá cao trình cắm cho "những gì mọi lập trình viên nên biết về mã hóa ký tự: http://joelonsoftware.com/articles/Unicode.html – fooMonster

9

Trong Java, ký tự được mã hóa trong UTF-16 sử dụng 2 byte, trong khi chuỗi C bình thường là nhiều hoặc ít hơn chỉ là một chuỗi byte. Khi C được thiết kế, sử dụng ASCII (chỉ bao gồm bộ ký tự ngôn ngữ tiếng Anh) được coi là đủ, trong khi các nhà thiết kế Java đã chiếm quốc tế hóa. Nếu bạn muốn sử dụng Unicode với chuỗi C, mã hóa UTF-8 là cách ưa thích vì nó có ASCII là tập con và không sử dụng 0 byte (không giống UTF-16), được sử dụng làm điểm đánh dấu đầu cuối trong C. Chẳng hạn như một điểm đánh dấu đầu cuối là không cần thiết trong Java vì một chuỗi là một kiểu phức tạp ở đây, với độ dài rõ ràng.

-1

Java được sử dụng như là một quốc tế hóa, công việc của nó trong các ngôn ngữ khác nhau và cần không gian nhiều hơn một byte, đó là lý do tại sao nó mất 2byte không gian trong char. ví dụ: ngôn ngữ Trung Quốc không thể hanfle một byte char.

3

Trong các ngôn ngữ trước như C ASCII ký hiệu được sử dụng. Và phạm vi là 127, cho 127 các ký hiệu duy nhấtký tự ngôn ngữ.

Trong khi JAVA đi kèm với một tính năng gọi là "quốc tế hóa", có nghĩa là tất cả các human readable ký tự (Bao gồm những biểu tượng Regional) cũng được thêm vào nó, và phạm vi cũng được tăng lên, vì vậy nhiều bộ nhớ bắt buộc, hệ thống để thống nhất tất cả các ký hiệu này là "Hệ thống Unicode chuẩn" và do đó này Hợp nhất yêu cầu thêm byte trong JAVA.

byte đầu tiên vẫn giữ nguyên và các ký tự ASCII được thay đổi thành 127 như trong C, C++ nhưng ký tự hợp nhất được thêm vào chúng.

Vì vậy, 16-bit cho char trong JAVA và 8-bit cho char trong C.

-2

Như chúng ta đã biết suppors c ASCII nơi như java hỗ trợ Unicode, trong đó có 3 điều đó là 1-ASCII 2 mở rộng ASCII Ký tự 3 ngôn ngữ địa phương ASCII là một tập hợp con của unicode.ASCII chỉ hỗ trợ ngôn ngữ tiếng Anh khi Unicode hỗ trợ ngôn ngữ đa quốc gia. Ký tự java khác được mã hóa trong UTF-16 sử dụng 2 byte.cho tất cả lý do và dưới dạng Unicode là phiên bản mở rộng của ASCII, vì vậy nó sử dụng 16 bit insted của 8 bit.

0

Hướng dẫn Java ™: Loại dữ liệu char là một ký tự Unicode 16 bit. Nó có giá trị tối thiểu là '\ u0000' (hoặc 0) và giá trị tối đa là '\ uffff' (hoặc 65.535 bao gồm).

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