java jframe title - ResourceBundle을 사용하여 리소스 속성에서 UTF-8을 사용하는 방법





7 Answers

ResourceBundle의 인스턴스가 있고 String을 다음과 같이 얻을 수 있습니다.

String val = bundle.getString(key); 

일본어 디스플레이 문제를 해결했습니다.

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

Java의 ResourceBundle 사용하여 리소스 속성에서 UTF-8을 사용해야합니다. 특성 파일에 직접 텍스트를 입력하면 mojibake로 표시됩니다.

내 앱은 Google App Engine에서 실행됩니다.

아무도 내게 모범을 줄 수 있습니까? 나는이 일을 할 수 없다.




속성 파일에서 cp1251 charset을 사용하는 경우 UTF-8 및 새로운 String 메서드가있는 ResourceBundle.Control 이 작동하지 않습니다.

그래서 일반적인 방법을 사용하여 권장 : 유니 코드 기호로 작성하십시오. 이것을 위해 :

IDEA - 특별한 " 투명한 네이티브 - ASCII 변환 " 옵션 (설정> 파일 인코딩)이 있습니다.

Eclipse - 플러그인 " Properties Editor "가 있습니다. 그것은 별도의 응용 프로그램으로 작동 할 수 있습니다.




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);  
            }  
        }  
    }  
}  



주의 : Java 속성 파일은 ISO 8859-1로 인코딩되어야합니다!

ISO 8859-1 문자 인코딩. 이 인코딩에서 직접 표현할 수없는 문자는 유니 코드 이스케이프를 사용하여 작성할 수 있습니다. 단일 'u'문자 만 이스케이프 시퀀스에 허용됩니다.

@see Properties 자바 문서

여전히 정말로 이것을하고 싶다면 : 자바 속성 UTF-8 인코딩 (Eclipse) - 코드 샘플이있다.




Guava의 뛰어난 지원 라이브러리와 try-with-resources 구조를 사용하는 Java 7 솔루션이 있습니다. 가장 단순한 전반적인 경험을 위해 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
}



Properties prop = new Properties();
String fileName = "./src/test/resources/predefined.properties";
FileInputStream inputStream = new FileInputStream(fileName);
InputStreamReader reader = new InputStreamReader(inputStream,"UTF-8");



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");





Related