Tôi cần mã hóa/giải mã mảng byte UTF-16 đến và từ java.lang.String
. Các mảng byte được gán cho tôi với một Byte Order Marker (BOM) và tôi cần mã hóa các mảng byte với một BOM.Làm cách nào để mã hóa/giải mã mảng byte UTF-16LE bằng BOM?
Ngoài ra, vì tôi đang giao dịch với máy khách/máy chủ Microsoft, tôi muốn phát ra mã hóa ở dạng cuối nhỏ (cùng với LE BOM) để tránh bất kỳ sự hiểu lầm nào. Tôi nhận ra rằng với hội đồng quản trị nó nên làm việc lớn endian, nhưng tôi không muốn bơi ngược dòng trong thế giới Windows.
Như một ví dụ, đây là một phương pháp mã hóa một java.lang.String
như UTF-16
trong little endian với BOM:
public static byte[] encodeString(String message) {
byte[] tmp = null;
try {
tmp = message.getBytes("UTF-16LE");
} catch(UnsupportedEncodingException e) {
// should not possible
AssertionError ae =
new AssertionError("Could not encode UTF-16LE");
ae.initCause(e);
throw ae;
}
// use brute force method to add BOM
byte[] utf16lemessage = new byte[2 + tmp.length];
utf16lemessage[0] = (byte)0xFF;
utf16lemessage[1] = (byte)0xFE;
System.arraycopy(tmp, 0,
utf16lemessage, 2,
tmp.length);
return utf16lemessage;
}
cách tốt nhất để làm điều này trong Java là gì? Lý tưởng nhất là tôi muốn tránh sao chép toàn bộ mảng byte vào một mảng byte mới có hai byte bổ sung được cấp phát lúc đầu.
Cũng vậy với giải mã một chuỗi như vậy, nhưng đó là nhiều hơn nữa đơn giản bằng cách sử dụng các java.lang.String
constructor:
public String(byte[] bytes,
int offset,
int length,
String charsetName)
Cảm ơn! Một vấn đề khác mặc dù ... Sử dụng "UTF-16" mã hóa dữ liệu như Big Endian, mà tôi nghi ngờ sẽ không đi quá tốt với dữ liệu Microsoft (mặc dù BOM tồn tại). Bất kỳ cách nào để mã hóa UTF-16LE với BOM với Java? Tôi sẽ cập nhật câu hỏi của mình để phản ánh những gì tôi thực sự đang tìm kiếm ... –
Nhấp vào liên kết "xem bài đăng này" mà anh ấy đã cung cấp. Về cơ bản, bạn có một ký tự \ uFEFF ở đầu chuỗi của bạn, và sau đó mã hóa thành UTF-16LE, và kết quả sẽ có một BOM phù hợp. –
Sử dụng "UnicodeLittle" (giả sử JRE của bạn hỗ trợ nó - ("\ uEFFF" + "chuỗi của tôi"). GetBytes ("UTF-16LE") nếu không). Mặc dù tôi sẽ ngạc nhiên nếu Microsoft API mong đợi một BOM nhưng không thể xử lý dữ liệu lớn về cuối - họ có xu hướng thích sử dụng BOM hơn các nền tảng khác. Thử nghiệm với các chuỗi rỗng - bạn có thể nhận được các mảng trống nếu không có dữ liệu. – McDowell