2012-01-13 29 views
17

Tôi đã đi qua dòng này của mã di sản, mà tôi đang cố gắng tìm ra:Java Chuỗi mã hóa (UTF-8)

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 

Theo như tôi có thể hiểu được, nó được mã hóa & giải mã bằng cách sử dụng cùng một charSet.

Điều này khác với những điều sau đây như thế nào?

String newString = oldString; 

Có trường hợp nào trong đó hai dòng sẽ có đầu ra khác nhau không?

p.s .: Chỉ cần làm rõ, có, tôi biết về số excellent article on encoding by Joel Spolsky!

+8

Vâng tất nhiên, * một * Sự khác biệt là với 'Chuỗi newString = oldString;', bạn vẫn chỉ có một bản sao của chuỗi (bạn chỉ cần trỏ đến nó từ hai biến). Giải mã/mã hóa tạo một bản sao * của chuỗi. Nó không quan trọng lắm, vì 'String' là không thay đổi. Điều này có lẽ không phải là lý do tại sao mã cũ là như vậy, mặc dù; 'String' có cách trực tiếp hơn nhiều để sao chép chính nó (' String (String) '). Tôi không thể nghĩ ra lý do * tốt * tại sao bạn lại làm mã hóa/giải mã, ngoài việc kiểm tra các phương thức mã hóa/giải mã của lớp 'String'. –

+0

Ngữ cảnh có đưa ra bất kỳ gợi ý nào về việc chuyển đổi chuỗi có thể có hoặc cần thiết không? –

+0

@ T.J.Crowder: +1, ofcourse! Tôi không có nghĩa là sự khác biệt trong đối tượng thực tế được đề cập. Cảm ơn bạn đã chỉ ra điều đó. – OceanBlue

Trả lời

22

Điều này có thể trở nên phức tạp cách làm

String newString = new String(oldString); 

này rút ngắn String là char cơ bản [] sử dụng là lâu hơn nữa.

Tuy nhiên cụ thể hơn, nó sẽ kiểm tra xem mọi ký tự có thể được mã hóa UTF-8 hay không.

Có một số "nhân vật" bạn có thể có trong một String mà không thể được mã hóa và này sẽ được biến thành ?

Bất kỳ nhân vật giữa \ uD800 và \ uDFFF không thể được mã hóa và sẽ được biến thành '?'

String oldString = "\uD800"; 
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"); 
System.out.println(newString.equals(oldString)); 

in

false 
+0

Tuyệt vời! Cảm ơn. – OceanBlue

+1

Lý do duy nhất 'oldString' không mã hóa đúng là vì nó không phải là chuỗi UTF-16 hợp lệ (biểu diễn gốc của chuỗi trong Java) để bắt đầu. UTF-8 hoàn toàn có khả năng mã hóa bất kỳ và tất cả các điểm mã Unicode. Trong trường hợp này, sẽ chỉ có sự khác biệt khi 'oldString' chứa một chuỗi UTF-16 không hợp lệ. – Cagatay

4

Điều này khác với những điều sau đây như thế nào?

dòng mã này ở đây:

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 

xây dựng một đối tượng String mới (tức là một bản sao của oldString), trong khi dòng mã này:

String newString = oldString; 

khai báo một biến mới của gõ java.lang.String và khởi tạo nó để tham chiếu đến cùng một đối tượng String như biến oldString.

Có trường hợp nào trong đó hai dòng sẽ có đầu ra khác nhau không?

Tuyệt đối:

String newString = oldString; 
boolean isSameInstance = newString == oldString; // isSameInstance == true 

vs

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 
// isSameInstance == false (in most cases)  
boolean isSameInstance = newString == oldString; 

a_horse_with_no_name (xem bình luận) là đúng tất nhiên. Tương đương

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 

String newString = new String(oldString); 

trừ sự khác biệt tinh tế wrt mã hóa mà Peter Lawrey giải thích trong câu trả lời của mình.

+0

'Chuỗi newString = new String (oldString)' sẽ tương đương với dòng "gốc" tôi đoán –