này hoạt động, nhưng chỉ với ASCII. Nếu bạn sử dụng các ký tự unicode ngoài phạm vi ASCCI, thì bạn sẽ có vấn đề (vì mỗi ký tự được nhồi vào một byte, thay vì một từ đầy đủ được cho phép bởi UTF-8). Bạn có thể thực hiện việc định kiểu dưới đây bởi vì bạn biết rằng UTF-8 sẽ không tràn một byte nếu bạn đảm bảo rằng đầu vào về cơ bản là ASCII (như bạn đã đề cập trong các nhận xét của mình).
package sample;
import java.io.UnsupportedEncodingException;
public class UnicodeSample {
public static final int HEXADECIMAL = 16;
public static void main(String[] args) {
try {
String str = "\\u0068\\u0065\\u006c\\u006c\\u006f\\u000a";
String arr[] = str.replaceAll("\\\\u"," ").trim().split(" ");
byte[] utf8 = new byte[arr.length];
int index=0;
for (String ch : arr) {
utf8[index++] = (byte)Integer.parseInt(ch,HEXADECIMAL);
}
String newStr = new String(utf8, "UTF-8");
System.out.println(newStr);
}
catch (UnsupportedEncodingException e) {
// handle the UTF-8 conversion exception
}
}
}
Đây là giải pháp khác khắc phục sự cố chỉ hoạt động với các ký tự ASCII. Điều này sẽ làm việc với bất kỳ ký tự unicode nào trong phạm vi UTF-8 thay vì ASCII chỉ trong 8 bit đầu tiên của dải ô. Nhờ lừa dối cho các câu hỏi. Bạn làm cho tôi suy nghĩ thêm về vấn đề và giải pháp.
package sample;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
public class UnicodeSample {
public static final int HEXADECIMAL = 16;
public static void main(String[] args) {
try {
String str = "\\u0068\\u0065\\u006c\\u006c\\u006f\\u000a\\u3fff\\uf34c";
ArrayList<Byte> arrList = new ArrayList<Byte>();
String codes[] = str.replaceAll("\\\\u"," ").trim().split(" ");
for (String c : codes) {
int code = Integer.parseInt(c,HEXADECIMAL);
byte[] bytes = intToByteArray(code);
for (byte b : bytes) {
if (b != 0) arrList.add(b);
}
}
byte[] utf8 = new byte[arrList.size()];
for (int i=0; i<arrList.size(); i++) utf8[i] = arrList.get(i);
str = new String(utf8, "UTF-8");
System.out.println(str);
}
catch (UnsupportedEncodingException e) {
// handle the exception when
}
}
// Takes a 4 byte integer and and extracts each byte
public static final byte[] intToByteArray(int value) {
return new byte[] {
(byte) (value >>> 24),
(byte) (value >>> 16),
(byte) (value >>> 8),
(byte) (value)
};
}
}
Đó không phải là UTF-8; đó chỉ là một chuỗi có chứa sự biểu diễn của Unicode thoát. –