การResourceBundle#getBundle()
ใช้ภายใต้หน้าปกPropertyResourceBundle
เมื่อ.properties
ระบุไฟล์ สิ่งนี้จะใช้ตามค่าเริ่มต้นProperties#load(InputStream)
เพื่อโหลดไฟล์คุณสมบัติเหล่านั้น ตามjavadocพวกเขาจะอ่านตามค่าเริ่มต้นเป็น ISO-8859-1
public void load(InputStream inStream) throws IOException
อ่านรายการคุณสมบัติ (คู่คีย์และองค์ประกอบ) จากอินพุตไบต์สตรีม สตรีมอินพุตอยู่ในรูปแบบบรรทัดที่เรียบง่ายตามที่ระบุในโหลด (Reader)และจะถือว่าใช้การเข้ารหัสอักขระ ISO 8859-1 ; นั่นคือแต่ละไบต์คืออักขระละติน 1 ตัว อักขระที่ไม่ได้อยู่ใน Latin1 และอักขระพิเศษบางตัวถูกแสดงในคีย์และองค์ประกอบโดยใช้ Unicode Escape ตามที่กำหนดไว้ในส่วน 3.3 ของข้อกำหนดภาษา Java ™
ดังนั้นคุณต้องบันทึกเป็น ISO-8859-1 หากคุณมีตัวละครที่เกิน ISO-8859-1 และคุณไม่สามารถใช้ส่วน\uXXXX
บนของหัวได้ดังนั้นคุณจึงถูกบังคับให้บันทึกไฟล์เป็น UTF-8 ดังนั้นคุณต้องใช้native2asciiเครื่องมือเพื่อแปลง ไฟล์คุณสมบัติ UTF-8 ที่บันทึกเป็นไฟล์คุณสมบัติ ISO-8859-1 ที่บันทึกไว้ซึ่งอักขระที่ไม่ได้เปิดทั้งหมดจะถูกแปลงเป็น\uXXXX
รูปแบบ ตัวอย่างด้านล่างแปลงไฟล์คุณสมบัติที่เข้ารหัส UTF-8 เป็นไฟล์คุณสมบัติที่เข้ารหัสtext_utf8.properties
ISO-8859-1 ที่ถูกtext.properties
ต้อง
native2ascii - การเข้ารหัส UTF-8 text_utf8.properties text.properties
เมื่อใช้ IDE ที่มีสติเช่น Eclipse สิ่งนี้จะถูกทำโดยอัตโนมัติเมื่อคุณสร้าง.properties
ไฟล์ในโปรเจ็กต์ที่ใช้ Java และใช้เอดิเตอร์ของ Eclipse เอง Eclipse จะแปลงอักขระที่อยู่นอกเหนือช่วง ISO-8859-1 ให้เป็น\uXXXX
รูปแบบที่โปร่งใส ดูภาพหน้าจอด้านล่าง (สังเกตแท็บ "คุณสมบัติ" และ "แหล่งที่มา" ที่ด้านล่างคลิกเพื่อดูภาพใหญ่):
หรือคุณยังสามารถสร้างที่กำหนดเองResourceBundle.Control
การดำเนินการนั้นคุณอย่างชัดเจนอ่านไฟล์คุณสมบัติเป็น UTF-8 ใช้InputStreamReader
เพื่อให้คุณสามารถเพียงบันทึกเป็น UTF-8 native2ascii
โดยไม่จำเป็นต้องยุ่งยากกับ นี่คือตัวอย่างกำหนดการ:
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;
}
}
สามารถใช้งานได้ดังนี้:
ResourceBundle bundle = ResourceBundle.getBundle("com.example.i18n.text", new UTF8Control());
ดูสิ่งนี้ด้วย: