Tại sao Java sử dụng UTF-16 để biểu diễn chuỗi bên trong?


29

Tôi sẽ tưởng tượng lý do là nhanh, mảng giống như truy cập vào ký tự, nhưng một số ký tự sẽ không khớp với 16 bit, vì vậy nó sẽ không hoạt động ...

Vì vậy, nếu bạn phải xử lý các trường hợp đặc biệt, tại sao không sử dụng UTF-8?


4
Một cái gì đó để hỏi các nhà thiết kế Java, không phải cộng đồng nói chung. Bỏ phiếu để đóng như không xây dựng.
Oded

16
@Oded: hoàn toàn không chính đáng, như câu trả lời của DeadMG cho thấy.
Michael Borgwardt

Tôi bối rối: Tôi khá chắc chắn rằng câu hỏi này đã được trả lời (cả ở đây và trên SO), nhưng tôi không thể tìm thấy (các) bản sao.
Joachim Sauer

Đối với nho khô cuồng loạn. Xem utf8everywhere.org
Pavel Radzivilovsky

Câu trả lời:


47

Bởi vì nó từng là UCS-2 , là một bit 16 bit có độ dài cố định đẹp. Tất nhiên, 16bit hóa ra là không đủ. Họ trang bị thêm UTF-16 ở trên đầu.


6
Dưới đây là trích dẫn từ Câu hỏi thường gặp về Unicode : Originally, Unicode was designed as a pure 16-bit encoding, aimed at representing all modern scripts. (Ancient scripts were to be represented with private-use characters.) Over time, and especially after the addition of over 14,500 composite characters for compatibility with legacy sets, it became clear that 16-bits were not sufficient for the user community. Out of this arose UTF-16.Tại thời điểm phát hành Java UTF-16 chưa xuất hiện và UTF-8 không phải là một phần của tiêu chuẩn Unicode.
Malcolm

20
UCS-2 là một thuật ngữ kỹ thuật, không phải là một từ thông dụng.
DeadMG

14

Đối với phần chính, vì mục đích của việc chứng minh tương lai đơn giản và đơn giản. Cho dù đó là một lý do sai lầm và cách đi sai về nó là một câu hỏi khác nhau.

Bạn có thể thấy một số lý do đằng sau một số quyết định thiết kế của họ trong tài liệu này về việc chuyển đổi năm 2004 sang Java 5 và UTF-16, giải thích một số thiếu sót: Các ký tự bổ sung trong Nền tảng Java và xem Tại sao hệ sinh thái Java sử dụng mã hóa khác nhau trong suốt ngăn xếp của họ? .

Để biết thêm chi tiết về những cạm bẫy của việc sử dụng UTF-16 và tại sao nói chung UTF-8 có thể là một lựa chọn tốt hơn, xem UTF-16 có nên được coi là có hại không? và bản tuyên ngôn UTF-8 ở mọi nơi .


8
+1 để liên kết đến "UTF-16 có nên được coi là có hại không?" câu hỏi Gần đây tôi đã phát hiện ra bản tuyên ngôn UTF-8 Everywhere và tôi tin rằng bây giờ tôi đã hoàn toàn bị thuyết phục. Đối với những gì nó có giá trị, mặc dù Java đã hiểu sai, tôi khá tin rằng Windows đã làm điều tồi tệ hơn nhiều.
Daniel Pryden

5
Chà, không có gì ngạc nhiên khi Windows hiểu sai nhiều hơn : Họ đã chuyển sang Unicode trước đó, vì vậy họ có ít lựa chọn chính xác hơn và ít kinh nghiệm hơn. Java có sau, hiểu đúng hơn , nhưng vẫn hơi sai. Bây giờ cả hai phải sống với các API cũ, không chính xác theo nghĩa chung mà họ phải tiếp tục hỗ trợ.
Joachim Sauer

4
Đó là cuộc sống trong thế giới phần mềm, bạn phải đưa ra lựa chọn mà không cần có tất cả dữ liệu và khi bạn sai, bạn sẽ phải sống với hậu quả trong một thời gian dài. :-)
Brian Knoblauch

2
Tôi tự hỏi ý nghĩa hiệu năng sẽ là gì khi tạo ra stringmột loại "đặc biệt" trong Java (giống như Arraylà), thay vì Stringlà một lớp "thông thường" chứa tham chiếu đến một mảng "thông thường" chứa các ký tự thực tế. Tùy thuộc vào cách tạo chuỗi, UTF-8, UTF-16 hoặc thậm chí UTF-32 có thể là cách lưu trữ chuỗi hiệu quả nhất. Tôi không nghĩ có cách nào đặc biệt hiệu quả để một lớp "thông thường" Stringxử lý nhiều định dạng, nhưng một loại "đặc biệt" có hỗ trợ JVM có thể.
supercat

@supercat: Tôi không có câu trả lời chính xác cho điều đó, nhưng tôi đã có câu trả lời SO liên quan cho điều đó. :) Không thực sự giải quyết cách tiếp cận loại đặc biệt, nhưng thảo luận về lợi ích tiềm năng của việc có các chuỗi hợp lý.
haylem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.