Việc ResourceBundle#getBundle()
sử dụng dưới vỏ bọc PropertyResourceBundle
khi một .properties
tập tin được chỉ định. Điều này lần lượt sử dụng theo mặc định Properties#load(InputStream)
để tải các tệp thuộc tính. Theo javadoc , theo mặc định, chúng được đọc là ISO-8859-1.
public void load(InputStream inStream) throws IOException
Đọc danh sách thuộc tính (cặp khóa và phần tử) từ luồng byte đầu vào. Luồng đầu vào có định dạng hướng dòng đơn giản như được chỉ định trong tải (Reader) và được giả định sử dụng mã hóa ký tự ISO 8859-1 ; đó là mỗi byte là một ký tự Latin1. Các ký tự không phải bằng tiếng Latin1 và một số ký tự đặc biệt nhất định, được biểu thị bằng các khóa và thành phần bằng cách sử dụng ký tự Unicode như được định nghĩa trong phần 3.3 của Đặc tả ngôn ngữ Java ™.
Vì vậy, bạn cần lưu chúng dưới dạng ISO-8859-1. Nếu bạn có bất kỳ ký tự nào ngoài phạm vi ISO-8859-1 và bạn không thể sử dụng \uXXXX
đầu trên và do đó bạn buộc phải lưu tệp dưới dạng UTF-8, thì bạn cần sử dụng công cụ gốc2ascii để chuyển đổi Tệp thuộc tính đã lưu UTF-8 thành tệp thuộc tính đã lưu ISO-8859-1 trong đó tất cả các ký tự không được phát hiện được chuyển đổi thành \uXXXX
định dạng. Ví dụ dưới đây chuyển đổi tệp thuộc tính được mã hóa UTF-8 thành tệp thuộc tính được mã hóa text_utf8.properties
ISO-8859-1 hợp lệ text.properties
.
local2ascii -encoding UTF-8 text_utf8.properies text.properies
Khi sử dụng một IDE lành mạnh như Eclipse, điều này đã được thực hiện tự động khi bạn tạo một .properties
tệp trong dự án dựa trên Java và sử dụng trình soạn thảo riêng của Eclipse. Eclipse sẽ chuyển đổi một cách trong suốt các ký tự ngoài phạm vi ISO-8859-1 sang \uXXXX
định dạng. Xem thêm bên dưới ảnh chụp màn hình (lưu ý các tab "Thuộc tính" và "Nguồn" ở dưới cùng, nhấp cho lớn):
Ngoài ra, bạn cũng có thể tạo một ResourceBundle.Control
triển khai tùy chỉnh trong đó bạn đọc rõ ràng các tệp thuộc tính dưới dạng UTF-8 InputStreamReader
, để bạn có thể lưu chúng dưới dạng UTF-8 mà không cần phải gặp rắc rối native2ascii
. Đây là một ví dụ khởi động:
public class UTF8Control extends Control {
public ResourceBundle newBundle
(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException
{
// The below is a copy of the default implementation.
String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, "properties");
ResourceBundle bundle = null;
InputStream stream = null;
if (reload) {
URL url = loader.getResource(resourceName);
if (url != null) {
URLConnection connection = url.openConnection();
if (connection != null) {
connection.setUseCaches(false);
stream = connection.getInputStream();
}
}
} else {
stream = loader.getResourceAsStream(resourceName);
}
if (stream != null) {
try {
// Only this line is changed to make it to read properties files as UTF-8.
bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));
} finally {
stream.close();
}
}
return bundle;
}
}
Điều này có thể được sử dụng như sau:
ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", new UTF8Control());
Xem thêm: