วิธีใช้ UTF-8 ในคุณสมบัติทรัพยากรที่มี ResourceBundle


259

ฉันต้องใช้ UTF-8 ในคุณสมบัติของทรัพยากรของฉันโดยใช้ของ ResourceBundleJava เมื่อฉันป้อนข้อความลงในไฟล์คุณสมบัติโดยตรงมันจะแสดงเป็นโมจิเบค

แอพของฉันทำงานบน Google App Engine

ใครช่วยยกตัวอย่างได้บ้าง ฉันไม่สามารถทำงานนี้ได้


1
Java 1.6 แก้ไขสิ่งนี้ตามที่คุณสามารถผ่านใน Reader ดู @Chinaxing คำตอบทางลงด้านล่าง
Will

1
@Will: คำถามเป็นหลักเกี่ยวกับการอ่านพวกเขาผ่านทางไม่java.util.ResourceBundle java.util.Properties
BalusC

1
ตรวจสอบคำถามที่ได้รับคำตอบนี้หวังว่าจะช่วยคุณได้ [ stackoverflow.com/questions/863838/… [1]: stackoverflow.com/questions/863838/…
Majdy the โปรแกรมเมอร์ Bboy

6
JDK9 ควรสนับสนุน UTF-8 โดยกำเนิดให้ดูJEP 226
Paolo Fulgoni

คำตอบ:


375

การ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.propertiesISO-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());

ดูสิ่งนี้ด้วย:


ขอบคุณ BTW ดูเหมือนว่าเป็นความคิดที่ดีที่จะแทนที่ getFormats เพื่อส่งกลับ FORMAT_PROPERTIES
Flávio Etrusco

คุณช่วยอธิบายเกี่ยวกับข้อเสนอแนะนี้เพื่อแทนที่ getFormats () ได้หรือไม่?
Mark Roper

1
@ imgx64: ขอบคุณสำหรับการแจ้งเตือน คำตอบได้รับการแก้ไขแล้ว
BalusC

10
อย่าลังเลที่จะใช้StandardCharsets.UTF_8หากคุณใช้ Java 7+
Niks

1
@ Nyerguds: ถ้าคุณเห็นเหตุผลที่จะเปลี่ยนโปรแกรม (ฉันไม่สามารถจินตนาการถึงชีวิตได้) ตัวอย่างโค้ดทั้งหมดที่ฉันโพสต์เป็นเพียงตัวอย่างกำหนดการหลังจากทั้งหมด
BalusC

131

ระบุว่าคุณมีอินสแตนซ์ของ ResourceBundle และคุณสามารถรับสตริงโดย:

String val = bundle.getString(key); 

ฉันแก้ไขปัญหาการแสดงผลภาษาญี่ปุ่นของฉันโดย:

return new String(val.getBytes("ISO-8859-1"), "UTF-8");

36
สำหรับผู้อัปยศ / ผู้แสดงความคิดเห็นที่ไร้เดียงสาทุกคนที่นี่: นี่ไม่ใช่ทางออก แต่เป็นวิธีแก้ปัญหา ปัญหาพื้นฐานที่แท้จริงยังคงอยู่และต้องการการแก้ไข
BalusC

2
นี่เป็นการแก้ไขสถานการณ์ของฉัน วิธีแก้ปัญหานี้จะช่วยให้ Java สามารถเริ่มต้นจัดการ UTF-8 ในชุดบันเดิลทรัพยากรและในไฟล์คุณสมบัติ จนกว่าสิ่งนั้นจะเกิดขึ้นฉันจะใช้วิธีแก้ปัญหา
JohnRDOrazio

@BalusC; ข้อเสียของวิธีการนี้คืออะไร? (นอกเหนือจากการสร้างสตริงพิเศษ?)
Paaske

8
@Paaske: มันเป็นวิธีแก้ปัญหาไม่ใช่วิธีแก้ปัญหา คุณจะต้องนำวิธีแก้ปัญหาไปใช้กับทุกสถานที่ในตัวแปรสตริงทั้งหมดตลอดทั้งฐานรหัส นี่เป็นเรื่องไร้สาระที่บริสุทธิ์ เพียงแก้ไขมันในที่เดียวที่ด้านขวาเพื่อให้ตัวแปรสตริงมีค่าที่ถูกต้องทันที ไม่ควรมีการแก้ไขไคลเอนต์
BalusC

3
ใช่ถ้าคุณต้องแก้ไขแอปพลิเคชันทั้งหมดแน่นอนว่ามันไม่ดี แต่ถ้าคุณใช้ ResourceBundle เป็นซิงเกิลคุณต้องแก้ไขเพียงครั้งเดียว ฉันรู้สึกว่าวิธีการแบบซิงเกิลเป็นวิธีที่พบได้บ่อยที่สุดในการใช้ ResourceBundle
Paaske

50

ดูที่นี่: http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#load(java.io.Reader)

คุณสมบัติยอมรับReaderวัตถุเป็นอาร์กิวเมนต์ซึ่งคุณสามารถสร้างจาก InputStream

ในเวลาที่สร้างคุณสามารถระบุการเข้ารหัสของ Reader:

InputStreamReader isr = new InputStreamReader(stream, "UTF-8");

จากนั้นใช้ตัวอ่านนี้กับวิธีโหลด:

prop.load(isr);

BTW: รับสตรีมจากไฟล์. properties :

 InputStream stream = this.class.getClassLoader().getResourceAsStream("a.properties");

BTW: รับกลุ่มทรัพยากรจากInputStreamReader:

ResourceBundle rb = new PropertyResourceBundle(isr);

หวังว่านี่จะช่วยคุณได้!


3
คำถามที่เกิดขึ้นจริงที่นี่เป็นเรื่องเกี่ยวกับResourceBundleแม้ว่า
Nyerguds

1
จริงอยู่คำตอบนี้ควรได้รับการยอมรับถ้าคุณใช้Propertiesและคุณต้องการที่จะดึงข้อมูลUTF-8String ดังนั้นมันจึงใช้งานได้อย่างมีเสน่ห์ อย่างไรก็ตามสำหรับResourceBundleทรัพยากรด้านภาษานั้นคำตอบที่ได้รับการยอมรับนั้นสง่างาม อย่างไรก็ตามถึงโหวตโหวตคำตอบ
IlgıtYıldırım

ResourceBundle rb = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"))
dedek

23

ResourceBundle.Control ด้วย UTF-8 และเมธอด String ใหม่จะไม่ทำงานหากไฟล์คุณสมบัติใช้ cp1251 charset เป็นต้น

ดังนั้นฉันขอแนะนำให้ใช้วิธีการทั่วไป: เขียนสัญลักษณ์ยูนิโค้ด สำหรับสิ่งนี้:

IDEA - มีพิเศษ" ใสพื้นเมืองเพื่อ ASCII แปลง "ตัวเลือก (การตั้งค่า> การเข้ารหัสไฟล์)

Eclipse - มีปลั๊กอิน" คุณสมบัติ Editor " มันสามารถทำงานเป็นแอปพลิเคชันแยกต่างหาก


4
ใน IntelliJ IDEA 14 จะอยู่ในการตั้งค่า -> ตัวแก้ไข -> การเข้ารหัสไฟล์ ฉันยังต้องลบไฟล์คุณสมบัติที่มีอยู่และสร้างใหม่อีกครั้งเพื่อให้ตัวเลือกนี้มีผล
Cypher

IDE นั้นไม่เกี่ยวข้องกับคำตอบ แต่เป็นเครื่องมือที่ไม่ได้แก้ปัญหาพื้นฐานของการไม่จัดเก็บเนื้อหาในชุดอักขระ UTF-8 .... ซึ่งจะแก้ปัญหาได้ทันทีโดยไม่ต้องแปลงหรือแฮกเกอร์เหมือนการเขียนคุณสมบัติ ในสัญลักษณ์ยูนิโค้ดภายในไฟล์ที่กำหนดด้วยชุดอักขระอื่น
Darrell Teague

21

ปัญหานี้ได้รับการแก้ไขในที่สุดใน Java 9: https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9

การเข้ารหัสเริ่มต้นสำหรับไฟล์คุณสมบัติคือ UTF-8

ไฟล์คุณสมบัติที่มีอยู่ส่วนใหญ่ไม่ควรได้รับผลกระทบ: UTF-8 และ ISO-8859-1 มีการเข้ารหัสเหมือนกันสำหรับอักขระ ASCII และการเข้ารหัสที่ไม่ใช่มนุษย์ ASCII ISO-8859-1 ที่อ่านไม่ได้เป็น UTF-8 ที่ไม่ถูกต้อง หากตรวจพบลำดับ UTF-8 ที่ไม่ถูกต้องรันไทม์ Java จะอ่านไฟล์ใน ISO-8859-1 อีกครั้งโดยอัตโนมัติ


19

เราสร้างไฟล์ resources.utf8 ที่มีทรัพยากรใน UTF-8 และมีกฎเพื่อเรียกใช้สิ่งต่อไปนี้:

native2ascii -encoding utf8 resources.utf8 resources.properties

เราnative2asciiมาจากไหน ฉันเพิ่งทำfind / -name native2ascii*และไม่มีผลลัพธ์ดังนั้นฉันจึงคิดว่ามันไม่ใช่แค่ส่วนหนึ่งของ JDK ...
ArtOfWarfare

ฮึ่ม มันไม่ได้เป็นส่วนหนึ่งของ IBM JDK แต่มันดูเหมือนว่าจะถูกรวมอยู่ในออราเคิล JDK jdk1.*.0_*/binใน
ArtOfWarfare

ดูเหมือนจะเป็นส่วนหนึ่งของ IBM JDK อย่างน้อยใน JDK 6
Eric Finn

19
package com.varaneckas.utils;  

import java.io.UnsupportedEncodingException;  
import java.util.Enumeration;  
import java.util.PropertyResourceBundle;  
import java.util.ResourceBundle;  

/** 
 * UTF-8 friendly ResourceBundle support 
 *  
 * Utility that allows having multi-byte characters inside java .property files. 
 * It removes the need for Sun's native2ascii application, you can simply have 
 * UTF-8 encoded editable .property files. 
 *  
 * Use:  
 * ResourceBundle bundle = Utf8ResourceBundle.getBundle("bundle_name"); 
 *  
 * @author Tomas Varaneckas <tomas.varaneckas@gmail.com> 
 */  
public abstract class Utf8ResourceBundle {  

    /** 
     * Gets the unicode friendly resource bundle 
     *  
     * @param baseName 
     * @see ResourceBundle#getBundle(String) 
     * @return Unicode friendly resource bundle 
     */  
    public static final ResourceBundle getBundle(final String baseName) {  
        return createUtf8PropertyResourceBundle(  
                ResourceBundle.getBundle(baseName));  
    }  

    /** 
     * Creates unicode friendly {@link PropertyResourceBundle} if possible. 
     *  
     * @param bundle  
     * @return Unicode friendly property resource bundle 
     */  
    private static ResourceBundle createUtf8PropertyResourceBundle(  
            final ResourceBundle bundle) {  
        if (!(bundle instanceof PropertyResourceBundle)) {  
            return bundle;  
        }  
        return new Utf8PropertyResourceBundle((PropertyResourceBundle) bundle);  
    }  

    /** 
     * Resource Bundle that does the hard work 
     */  
    private static class Utf8PropertyResourceBundle extends ResourceBundle {  

        /** 
         * Bundle with unicode data 
         */  
        private final PropertyResourceBundle bundle;  

        /** 
         * Initializing constructor 
         *  
         * @param bundle 
         */  
        private Utf8PropertyResourceBundle(final PropertyResourceBundle bundle) {  
            this.bundle = bundle;  
        }  

        @Override  
        @SuppressWarnings("unchecked")  
        public Enumeration getKeys() {  
            return bundle.getKeys();  
        }  

        @Override  
        protected Object handleGetObject(final String key) {  
            final String value = bundle.getString(key);  
            if (value == null)  
                return null;  
            try {  
                return new String(value.getBytes("ISO-8859-1"), "UTF-8");  
            } catch (final UnsupportedEncodingException e) {  
                throw new RuntimeException("Encoding not supported", e);  
            }  
        }  
    }  
}  

1
ฉันชอบโซลูชันนี้และฉันโพสต์ไว้เช่น Gist gist.github.com/enginer/3168dd4a374994718f0e
Sllouyssgort

มันใช้งานได้ดีมาก เพิ่งเพิ่มไฟล์คุณสมบัติการแปลภาษาจีนใน UTF8 และโหลดขึ้นโดยไม่มีปัญหาใด ๆ
tresf

9

ข้อควรสนใจ: ไฟล์คุณสมบัติ java ควรเข้ารหัสใน ISO 8859-1!

การเข้ารหัสอักขระ ISO 8859-1 อักขระที่ไม่สามารถแสดงโดยตรงในการเข้ารหัสนี้สามารถเขียนได้โดยใช้ Unicode escapes อนุญาตให้ใช้อักขระ 'u' เพียงตัวเดียวในลำดับการยกเว้น

@see Properties Java Doc

หากคุณยังต้องการทำสิ่งนี้: ดูที่: คุณสมบัติของ Java การเข้ารหัส UTF-8 ใน Eclipse - มีตัวอย่างโค้ดบางส่วน


1
Java! = Eclipse ... อันหลังคือ IDE ข้อมูลเพิ่มเติม! = Java Java รองรับการประมวลผลสตรีมโดยใช้ชุดอักขระจำนวนมากซึ่งสำหรับสากล (คำถามเกี่ยวกับ ResourceBundles หลังจากทั้งหมด) ... แก้ไขการใช้ UTF-8 เป็นคำตอบที่ตรงไปตรงมามากที่สุด การเขียนไฟล์คุณสมบัติในชุดอักขระที่ภาษาเป้าหมายไม่รองรับทำให้เกิดปัญหาโดยไม่จำเป็น
Darrell Teague

@Darell กวันที่: "แย้ม" ว่าไฟล์ propertie โหลดสำหรับ ResouceBundle ต้องได้รับการรับรอง ISO 8859-1 เป็นคำสั่งจาวา: docs.oracle.com/javase/8/docs/api/java/util/... .. ส่วนที่สองของคำตอบของฉันเป็นเพียง "คำใบ้" วิธีจัดการกับปัญหาหมวก
Ralph

5

http://sourceforge.net/projects/eclipse-rbe/

ตามที่ระบุไว้แล้วไฟล์คุณสมบัติควรเข้ารหัสใน ISO 8859-1

คุณสามารถใช้ปลั๊กอินด้านบนสำหรับ eclipse IDE เพื่อทำการแปลง Unicode ให้คุณ


3

นี่คือโซลูชัน Java 7 ที่ใช้ไลบรารีการสนับสนุนที่ยอดเยี่ยมของ Guava และโครงสร้างลองกับทรัพยากร มันอ่านและเขียนไฟล์คุณสมบัติโดยใช้ UTF-8 เพื่อประสบการณ์โดยรวมที่ง่ายที่สุด

หากต้องการอ่านไฟล์คุณสมบัติเป็น UTF-8:

File file =  new File("/path/to/example.properties");

// Create an empty set of properties
Properties properties = new Properties();

if (file.exists()) {

  // Use a UTF-8 reader from Guava
  try (Reader reader = Files.newReader(file, Charsets.UTF_8)) {
    properties.load(reader);
  } catch (IOException e) {
    // Do something
  }
}

ในการเขียนไฟล์คุณสมบัติเป็น UTF-8:

File file =  new File("/path/to/example.properties");

// Use a UTF-8 writer from Guava
try (Writer writer = Files.newWriter(file, Charsets.UTF_8)) {
  properties.store(writer, "Your title here");
  writer.flush();
} catch (IOException e) {
  // Do something
}

คำตอบนี้มีประโยชน์ ปัญหาหลักที่นี่พร้อมคำตอบที่หลากหลายดูเหมือนจะเข้าใจผิดเกี่ยวกับข้อมูลและชุดอักขระ Java สามารถอ่านข้อมูลใด ๆ (อย่างถูกต้อง) โดยเพียงระบุชุดอักขระที่จัดเก็บไว้ตามที่แสดงด้านบน โดยทั่วไปแล้ว UTF-8 จะใช้เพื่อสนับสนุนมากที่สุดหากไม่ใช่ทุกภาษาบนโลกและดังนั้นจึงเหมาะอย่างยิ่งกับคุณสมบัติที่ใช้ ResourceBundle
Darrell Teague

@DarrellTeague: ดี "UTF-8 มักใช้เพื่อสนับสนุน ... " - ควรจะมี " Unicodeมักใช้เพื่อสนับสนุน ... " :) เนื่องจาก UTF-8 เป็นเพียงการเข้ารหัสอักขระของ Unicode ( en .wikipedia.org / wiki / UTF-8 )
Honza Zidek

ที่จริงแล้ว UTF-8 นั้นถูกเรียกว่า "ชุดอักขระ" (เทียบกับการอ้างอิง 'ชุดอักขระใด ๆ ของ UniCode') เป็น UTF-8 ในบริบทนี้ (ข้อมูล) มีการใช้งานบนอินเทอร์เน็ตสูงกว่ามาตรการบางอย่าง 67% Ref: stackoverflow.com/questions/8509339/…
Darrell Teague

3

อย่างหนึ่งที่แนะนำให้ฉันดำเนินการโดยใช้บันเดิลรีซอร์ส .. แต่นั่นไม่ได้ช่วย .. เนื่องจากบันเดิลนั้นถูกเรียกใช้เสมอภายใต้โลแคล en_US ... ฉันพยายามตั้งค่าโลแคลเริ่มต้นเป็นภาษาอื่นและยังคงใช้ทรัพยากรบันเดิล การควบคุมถูกเรียกด้วย en_US ... ฉันพยายามใส่ข้อความบันทึกและทำขั้นตอนผ่านการดีบักและดูว่ามีการโทรภายในเครื่องอื่นหลังจากที่ฉันเปลี่ยนสถานที่เกิดเหตุในเวลาทำงานผ่านการโทร xhtml และ JSF ... ที่ไม่ได้เกิดขึ้น ... จากนั้นฉันพยายามตั้งค่าระบบเป็น utf8 สำหรับการอ่านไฟล์โดยเซิร์ฟเวอร์ของฉัน (เซิร์ฟเวอร์ tomcat) .. แต่นั่นทำให้เกิด pronlem เนื่องจากไลบรารีคลาสทั้งหมดของฉันไม่ได้ถูกคอมไพล์ภายใต้ utf8 และ tomcat เริ่มอ่านในรูปแบบ utf8 และเซิร์ฟเวอร์ทำงานไม่ถูกต้อง ... จากนั้นฉันก็จบลงด้วยการใช้วิธีการในตัวควบคุมจาวาของฉันที่จะเรียกจากไฟล์ xhtml ..ในวิธีการที่ฉันทำต่อไปนี้:

        public String message(String key, boolean toUTF8) throws Throwable{
            String result = "";
            try{
                FacesContext context = FacesContext.getCurrentInstance();
                String message = context.getApplication().getResourceBundle(context, "messages").getString(key);

                result = message==null ? "" : toUTF8 ? new String(message.getBytes("iso8859-1"), "utf-8") : message;
            }catch(Throwable t){}
            return result;
        }

ฉันรู้สึกประหม่าเป็นพิเศษเพราะนี่อาจทำให้ประสิทธิภาพการทำงานของแอปพลิเคชันช้าลง ... อย่างไรก็ตามหลังจากการใช้งานนี้ดูเหมือนว่าแอปพลิเคชันของฉันจะเร็วขึ้นในขณะนี้ .. ฉันคิดว่าเป็นเพราะตอนนี้ฉันกำลังเข้าถึงคุณสมบัติโดยตรง JSF วิเคราะห์วิธีการเข้าถึงคุณสมบัติ ... ฉันผ่านอาร์กิวเมนต์บูลีนในการโทรนี้โดยเฉพาะเพราะฉันรู้ว่าคุณสมบัติบางอย่างจะไม่ถูกแปลและไม่จำเป็นต้องอยู่ในรูปแบบ utf8 ...

ตอนนี้ฉันได้บันทึกไฟล์คุณสมบัติของฉันในรูปแบบ UTF8 แล้วและก็ใช้งานได้ดีเนื่องจากผู้ใช้แต่ละรายในแอปพลิเคชันของฉันมีการตั้งค่าสถานที่อ้างอิง



1

สำหรับสิ่งที่คุ้มค่ากับปัญหาของฉันคือไฟล์เหล่านั้นมีการเข้ารหัสผิด ใช้ iconv ทำงานให้ฉัน

iconv -f ISO-8859-15 -t UTF-8  messages_nl.properties > messages_nl.properties.new

+1 iconvสำหรับการกล่าวขวัญ ฉันไม่เคยได้ยินมาก่อน แต่ฉันพิมพ์มันลงในคอนโซลและดูแล้วมันเป็นสิ่งที่มีอยู่ (ใน CentOS 6, anyways.)
ArtOfWarfare

ตอนนี้ที่ฉันได้ลองใช้จริง ๆ แล้วมันไม่ได้ผล: มันสร้างตัวละครตัวแรกที่ไม่สามารถแปลงเป็น ISO-8559-1 ได้
ArtOfWarfare

1

ฉันพยายามใช้วิธีการที่จัดทำโดย Rod แต่คำนึงถึงความกังวลของ BalusC เกี่ยวกับการไม่ทำซ้ำการทำงานรอบเดียวกันในแอปพลิเคชันทั้งหมดและมาพร้อมกับคลาสนี้:

import java.io.UnsupportedEncodingException;
import java.util.Locale;
import java.util.ResourceBundle;

public class MyResourceBundle {

    // feature variables
    private ResourceBundle bundle;
    private String fileEncoding;

    public MyResourceBundle(Locale locale, String fileEncoding){
        this.bundle = ResourceBundle.getBundle("com.app.Bundle", locale);
        this.fileEncoding = fileEncoding;
    }

    public MyResourceBundle(Locale locale){
        this(locale, "UTF-8");
    }

    public String getString(String key){
        String value = bundle.getString(key); 
        try {
            return new String(value.getBytes("ISO-8859-1"), fileEncoding);
        } catch (UnsupportedEncodingException e) {
            return value;
        }
    }
}

วิธีใช้สิ่งนี้จะคล้ายกันมากกว่าการใช้ ResourceBundle ปกติ:

private MyResourceBundle labels = new MyResourceBundle("es", "UTF-8");
String label = labels.getString(key)

หรือคุณสามารถใช้ตัวสร้างทางเลือกซึ่งใช้ UTF-8 ตามค่าเริ่มต้น:

private MyResourceBundle labels = new MyResourceBundle("es");

0

เปิดกล่องโต้ตอบการตั้งค่า / การตั้งค่า ( Ctrl+ Alt+ S) จากนั้นคลิกตัวแก้ไขและการเข้ารหัสไฟล์

สกรีนช็อตของหน้าต่างที่แสดง

จากนั้นที่ด้านล่างคุณจะใช้การเข้ารหัสเริ่มต้นสำหรับไฟล์คุณสมบัติ เลือกประเภทการเข้ารหัสของคุณ

หรือคุณสามารถใช้สัญลักษณ์ยูนิโค้ดแทนข้อความในบันเดิลทรัพยากรของคุณ (ตัวอย่างเช่น"ів"เท่ากับ\u0456\u0432)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.