2012-03-14 20 views
39

Tôi đã tìm kiếm biểu diễn bên trong của Java cho String, nhưng tôi có hai tài liệu trông đáng tin cậy nhưng không nhất quán.represention nội bộ của Java cho String là gì? Đã sửa đổi UTF-8? UTF-16?

Một là:

http://www.codeguru.com/cpp/misc/misc/multi-lingualsupport/article.php/c10451

và nó nói:

Java sử dụng UTF-16 cho các đại diện văn bản nội bộ và hỗ trợ sửa đổi phi tiêu chuẩn của UTF- 8 cho chuỗi serialization.

khác là:

http://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8

và nó nói:

Tcl cũng sử dụng cùng một biến đổi UTF-8 [25] như Java cho trình bày nội dữ liệu Unicode, nhưng sử dụng CESU-8 nghiêm ngặt cho dữ liệu ngoài.

Đã sửa đổi UTF-8? Hoặc UTF-16? Cái nào đúng? Và Java sử dụng bao nhiêu byte cho một char trong bộ nhớ?

Vui lòng cho tôi biết cái nào là chính xác và số byte sử dụng.

+0

http://stackoverflow.com/questions/4655250/difference-between-utf-8-and-utf-16, điều này có thể trả lời câu hỏi của bạn. –

+0

Những gì Java sử dụng và những gì JVM sử dụng trong bộ nhớ không phải giống nhau. Xem câu trả lời của tôi. –

+1

nguồn chính của bạn (chính thức) thông tin về Java nên được http://java.sun.com! (_despite của stackoverflow_) –

Trả lời

50

Java sử dụng UTF-16 cho các đại diện văn bản nội bộ

Các đại diện cho String và StringBuilder vv trong Java là UTF-16

http://java.sun.com/javase/technologies/core/basic/intl/faq.jsp

như thế nào văn bản đại diện trong nền tảng Java?

Ngôn ngữ lập trình Java dựa trên bộ ký tự Unicode và một số thư viện triển khai chuẩn Unicode. Char kiểu dữ liệu nguyên thủy trong ngôn ngữ lập trình Java là một số nguyên không dấu 16 bit có thể biểu diễn một điểm mã Unicode trong phạm vi U + 0000 đến U + FFFF hoặc các đơn vị mã của UTF-16. Các loại và lớp khác nhau trong nền tảng Java đại diện cho chuỗi ký tự - char [], việc triển khai thực hiện java.lang.CharSequence (chẳng hạn như lớp String) và triển khai thực hiện java.text.CharacterIterator - là các chuỗi UTF-16.

Ở cấp JVM, nếu bạn đang sử dụng -XX:+UseCompressedStrings (đó là mặc định cho một số cập nhật của Java 6) thực tế đại diện trong bộ nhớ có thể được 8-bit, theo tiêu chuẩn ISO-8859-1 nhưng chỉ cho các chuỗi mà làm không cần mã hóa UTF-16.

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

và hỗ trợ sửa đổi phi tiêu chuẩn của UTF-8 cho chuỗi tuần tự.

Sử dụng chuỗi tuần tự UTF-8 theo mặc định.

Java sử dụng bao nhiêu byte cho bộ nhớ trong bộ nhớ?

A char luôn là hai byte, nếu bạn bỏ qua nhu cầu đệm trong đối tượng.

Lưu ý: điểm mã (cho phép ký tự> 65535) có thể sử dụng một hoặc hai ký tự, tức là 2 hoặc 4 byte.

+2

Tuần tự hóa Java (và các tệp lớp) [sử dụng sửa đổi CESU-8 mặc dù] (http://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8), là một sửa đổi UTF-8. – Deduplicator

+1

URL mới: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html –

+0

URL mới: https://docs.oracle.com/javase/8/docs/api /java/lang/String.html Lưu ý: Java 9 sẽ được ra vào năm tới. ;) –

9

Biểu diễn trong bộ nhớ được sử dụng trong mảng char của loại String là UTF-16. UTF-8 được sửa đổi được sử dụng trong các ngữ cảnh khác; ví dụ. trong các tệp ".class" và định dạng tuần tự hóa đối tượng.

Bạn có thể xác nhận điều này bằng cách xem mã nguồn của lớp java.lang.String.

CẬP NHẬT

Với Java 6 update 21 và sau đó, có một tùy chọn phi tiêu chuẩn cho phép chuỗi nén.

Với Java 9 trở lên, hành vi đã được thay đổi để sử dụng biểu diễn gọn nhẹ cho chuỗi theo mặc định. Các java lệnh documentation bây giờ nói này:

-XX: -CompactStrings

Vô hiệu hóa tính năng nhỏ gọn Strings. Theo mặc định, tùy chọn này được kích hoạt. Khi tùy chọn này được bật, các chuỗi Java chỉ chứa các ký tự một byte được biểu diễn trong nội bộ và được lưu trữ dưới dạng các chuỗi một byte cho mỗi ký tự sử dụng mã hóa ISO-8859-1/Latin-1. Điều này làm giảm 50% lượng không gian cần thiết cho các chuỗi chỉ chứa các ký tự một byte. Đối với các chuỗi Java chứa ít nhất một ký tự multibyte: chúng được biểu diễn và được lưu trữ dưới dạng 2 byte cho mỗi ký tự sử dụng mã hóa UTF-16. Việc tắt tính năng Compact Strings buộc sử dụng mã hóa UTF-16 làm biểu diễn nội bộ cho tất cả các chuỗi Java.

(Lưu ý rằng không phải mã hóa UTF-8.)

Xem thêm:

3

Kích thước của một char là 2 byte.

Vì vậy, tôi sẽ nói rằng Java sử dụng UTF-16 cho biểu diễn chuỗi bên trong.

+1

Ký tự Unicode có thể là 4 byte trong Java. – tchrist

+0

@tchrist Làm cách nào? Làm thế nào một ký tự trong Java có thể là 4 byte? –

+0

@KorayTugay Ký tự Unicode (điểm mã) là các giá trị từ 0 đến 0x10FFFF. – tchrist

10

UTF-16.

Từ http://java.sun.com/javase/technologies/core/basic/intl/faq.jsp:

như thế nào văn bản đại diện trong nền tảng Java?

Ngôn ngữ lập trình Java dựa trên bộ ký tự Unicode, và một số thư viện thực hiện tiêu chuẩn Unicode. Nguyên mẫu kiểu dữ liệu char trong ngôn ngữ lập trình Java là số nguyên không dấu có thể đại diện cho một điểm mã Unicode trong phạm vi U + 0000 đến U + FFFF hoặc đơn vị mã UTF-16. Các loại và lớp khác nhau trong nền tảng Java đại diện cho chuỗi ký tự - char [], việc triển khai java.lang.CharSequence (chẳng hạn như lớp String), và triển khai thực hiện java.text.CharacterIterator - là UTF-16 trình tự.

-4

Chuỗi cửa hàng Java trong nội bộ dưới dạng UTF-16 và sử dụng 2 byte cho mỗi ký tự.

+10

Câu trả lời này không đúng. Bởi vì Java sử dụng UTF-16, mỗi ký tự Unicode là 2 byte hoặc 4 byte. – tchrist

+0

@tchrist Làm cách nào để mã hóa UTF-16 có thể kết thúc bằng 4 byte? Không phải UTF-16 luôn là 2 byte? –

+4

@KhoayTugay Không, UTF-16 là 2 byte hoặc 4 byte. Nó là một mã hóa có độ rộng biến đổi giống như UTF-8. Chỉ UCS-2 lỗi thời là 2 byte và đã chết lâu rồi. – tchrist

-4

java có sẵn bằng 18 ngôn ngữ quốc tế và theo bộ ký tự UNICODE, chứa tất cả các ký tự có sẵn bằng 18 ngôn ngữ quốc tế và chứa 65536 ký tự. Và java sau UTF-16 để kích thước của char trong java là 2 byte.

+2

Kích thước của một ký tự Unicode trong Java thay đổi giữa 2 byte và 4 byte, tùy thuộc vào việc chúng ta đang ở mặt phẳng 0 hay không. – tchrist

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