리소스 속성에 ResourceBundle을 사용하여 UTF-8을 사용하는 방법
UTF-8을 .ResourceBundle
모지바케
내 앱은 구글 앱 엔진에서 실행된다.
누가 예를 들어주실 수 있나요?나는 이 일을 할 수 없다.
Java 9 이후
Java 9 이후 속성 파일은 기본적으로 UTF-8로 인코딩되며 ISO-8859-1 이외의 문자를 사용하면 즉시 사용할 수 있습니다.
Java 8 이전 버전
가 커버 안에서 사용하는 것은, 커버아래에서 사용합니다..properties
파일이 지정됩니다.그러면 기본적으로 를 사용하여 이러한 속성 파일을 로드합니다.javadoc에 따르면 기본적으로는 ISO-8859-1로 읽힙니다.
public void load(InputStream inStream) throws IOException
입력 바이트 스트림에서 속성 목록(키 및 요소 쌍)을 읽습니다.입력 스트림은 load(Reader)에서 지정된 단순한 행 지향 형식이며 ISO 8859-1 문자 인코딩을 사용하는 것으로 가정됩니다.즉, 각 바이트는 1개의 Latin1 문자입니다.Latin1 이외의 문자와 특정 특수 문자는 Java™ 언어 사양 섹션 3.3에 정의된 대로 유니코드 이스케이프를 사용하여 키 및 요소로 표시됩니다.
ISO-8859-1로 지정되었습니다.를 넘는 ISO-8859-1을 사용할 수 \uXXXX
즉석에서 파일을 UTF-8로 저장하도록 강요받습니다.그러면 native2ascii 툴을 사용하여 UTF-8 저장된 속성 파일을 ISO-8859-1 저장된 속성 파일로 변환해야 합니다.이 파일에서는 모든 언노블 문자가 변환됩니다.\uXXXX
에서는 파일인 UTF-8을 변환하고 있습니다.text_utf8.properties
부호화 파일 「」에 합니다.text.properties
.
native2ascii - 인코딩 UTF-8 text_utf8.properties text.properties
정상적인 IDE를 이클립스 IDE를 하면 이 됩니다..properties
Java 기반 프로젝트에 파일을 저장하고 Eclipse 자체 편집기를 사용합니다.를 벗어난 를 이클립스 ISO-8859-1로 합니다.\uXXXX
해 주세요(에 있는 해 주세요큰 는 클릭해 주세요).아래 스크린샷도 참조하십시오(아래쪽에 있는 "속성" 및 "소스" 탭을 참고하고 크게 보려면 클릭하십시오).
또는 를 사용하여 속성 파일을 UTF-8로 명시적으로 읽는 커스텀 구현을 작성할 수도 있습니다.이것에 의해, 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());
다음 항목도 참조하십시오.
ResourceBundle 인스턴스가 있고 다음 방법으로 String을 가져올 수 있습니다.
String val = bundle.getString(key);
일본어 디스플레이 문제는 다음과 같이 해결했습니다.
return new String(val.getBytes("ISO-8859-1"), "UTF-8");
여기를 봐주세요.http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#load(java.io.Reader)
속성은 InputStream에서 만들 수 있는 Reader 개체를 인수로 받아들입니다.
작성 시 판독기의 인코딩을 지정할 수 있습니다.
InputStreamReader isr = new InputStreamReader(stream, "UTF-8");
그런 다음 이 Reader를 로드 방법에 적용합니다.
prop.load(isr);
BTW: .properties 파일에서 스트림을 가져옵니다.
InputStream stream = this.class.getClassLoader().getResourceAsStream("a.properties");
BTW: 리소스 번들 가져오기InputStreamReader
:
ResourceBundle rb = new PropertyResourceBundle(isr);
이것이 너에게 도움이 될 수 있기를 바래!
이 문제는 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 바이트 시퀀스가 검출되면 Java 런타임은 ISO-8851의 파일을 자동으로 다시 읽습니다.
ResourceBundle.Control
예를 들어 속성 파일이 cp1251 문자 집합을 사용하는 경우 UTF-8 및 새로운 String 메서드가 작동하지 않습니다.
그래서 저는 유니코드 기호로 쓰는 일반적인 방법을 추천했습니다.이 경우:
IDEA - 특별한 'ASC에 대한 투과적 네이티브'가 있습니다.[ II conversion ]옵션([Settings]> [ File Encoding ])을 선택합니다.
Eclipse - 플러그인 "속성 편집기"가 있습니다.별도의 애플리케이션으로 작동할 수 있습니다.
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);
}
}
}
}
UTF-8의 리소스를 포함하는 resources.utf8 파일을 만들고 다음을 실행하는 규칙을 설정합니다.
native2ascii -encoding utf8 resources.utf8 resources.properties
주의:Java <= 8 Java 속성 파일은 ISO 8859-1로 인코딩되어야 합니다!
ISO 8859-1 문자 부호화이 인코딩에서 직접 나타낼 수 없는 문자는 Unicode 이스케이프를 사용하여 쓸 수 있습니다. 이스케이프 시퀀스에 사용할 수 있는 것은 1개의 'u' 문자뿐입니다.
@'프로퍼티 Java 문서"
그래도 이 작업을 수행하려면 다음을 참조하십시오.Eclipse의 Java 속성 UTF-8 인코딩 -- 코드 샘플이 있습니다.
Java 9: 속성 파일은 UTF-8로 인코딩되므로 문제/의심은 없습니다.
Java SE 9에서는 속성 파일은 UTF-8 인코딩으로 로드됩니다.이전 릴리스에서는 속성 리소스 번들을 로드하는 데 ISO-8859-1 인코딩이 사용되었습니다.
(https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9.htm#JSINT-GUID-9DCDB41C-A989-4220-8140-DBFB844A0FCA)
http://sourceforge.net/projects/eclipse-rbe/
이미 기술된 속성 파일은 ISO 8859-1로 인코딩되어야 합니다.
위 플러그인을 사용하여 이클립스 IDE에 유니코드 변환을 수행할 수 있습니다.
다음은 Guava의 뛰어난 지원 라이브러리와 리소스 테스트 구조를 사용하는 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
}
제안하신 대로 리소스 번들의 구현을 수행했습니다.하지만 그것은 도움이 되지 않았다.그 번들은 항상 en_로 불렸기 때문에미국 로케일...기본 로케일을 다른 언어로 설정하려고 했지만 리소스 번들 제어 구현이 en_US에서 호출되고 있었습니다.로그 메시지를 넣고 디버깅을 수행하여 실행 시 xhtml 및 JSF 호출을 통해 로케일을 변경한 후 다른 로컬 호출이 이루어지고 있는지 확인하려고 했습니다.그런 일은 일어나지 않았다...그런 다음 서버(하드웨어 서버)에서 파일을 읽기 위해 시스템 설정을 utf8로 설정하려고 했습니다.하지만 모든 클래스 라이브러리가 utf8로 컴파일되지 않았고 Tomcat이 읽기 시작했기 때문에 utf8 포맷으로 서버가 제대로 실행되지 않았기 때문에 pronlem이 발생하였습니다.그 후 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 형식일 필요가 없기 때문에 이 콜에서는 특히 Boolean 인수를 전달합니다.
이제 속성 파일을 UTF8 형식으로 저장했습니다.애플리케이션의 각 사용자가 참조 로케일 설정을 가지고 있기 때문에 정상적으로 동작하고 있습니다.
중요한 건 파일 자체의 인코딩이 잘못됐다는 거예요iconv를 사용하는 것은 나에게 효과가 있었다.
iconv -f ISO-8859-15 -t UTF-8 messages_nl.properties > messages_nl.properties.new
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");
Properties prop = new Properties();
String fileName = "./src/test/resources/predefined.properties";
FileInputStream inputStream = new FileInputStream(fileName);
InputStreamReader reader = new InputStreamReader(inputStream,"UTF-8");
[ Settings ] / Ctrl[ Preferences ]대화상자(++)를 열고 [Editor and File Encodings]을 클릭합니다.
그런 다음 아래쪽에서 속성 파일의 기본 인코딩을 핑거합니다.인코딩 유형을 선택합니다.
자원 번들 내의 할 수도 (예: " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""ів"
는 「」와 같습니다.\u0456\u0432
)
Java 9 에서는 속성 파일을 로드하는 기본값이 UTF-8로 변경되었습니다.https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9.htm
현재(2021-2) Java 버전에서는 오래된 ISO-8859-1 함수 유틸리티가 남아 있습니다.속성 #load.
공식 문서를 인용하겠습니다.
Property Resource Bundle
PropertyResourceBundle은 속성 파일을 나타내는 InputStream 또는 Reader에서 구성할 수 있습니다.InputStream에서 PropertyResourceBundle 인스턴스를 구성하려면 입력 스트림을 UTF-8로 인코딩해야 합니다.기본적으로 MalformedInputException 또는 UncapableCharacter인 경우입력 스트림을 읽을 때 예외가 발생하면 PropertyResourceBundle 인스턴스가 예외 이전 상태로 재설정되고 ISO-8859-1의 입력 스트림을 다시 읽은 후 계속 읽습니다.시스템 속성 java.util인 경우.PropertyResourceBundle.encoding은 "ISO-8859-1" 또는 "UTF-8" 중 하나로 설정되며 입력 스트림은 해당 인코딩에서만 읽혀지며 비활성 시퀀스가 발생하면 예외가 느려집니다.「ISO-8859-1」이 지정되어 있는 경우, ISO-8859-1 인코딩으로 나타낼 수 없는 문자는, Java™언어 사양의 섹션 3.3에 정의되어 있는 Unicode 이스케이프로 표시되어야 합니다.단, 리더를 사용하는 다른 컨스트럭터는 이러한 제한이 없습니다.이 시스템 속성에 대한 다른 인코딩 값은 무시됩니다.이 클래스를 초기화할 때 시스템 속성이 읽혀지고 평가됩니다.초기화 후 속성을 변경하거나 제거해도 아무런 영향이 없습니다.
https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/util/PropertyResourceBundle.html
속성 #로드
입력 바이트 스트림에서 속성 목록(키 및 요소 쌍)을 읽습니다.입력 스트림은 load(Reader)에서 지정된 단순한 행 지향 형식이며 ISO 8859-1 문자 인코딩을 사용하는 것으로 가정됩니다.즉, 각 바이트는 1개의 Latin1 문자입니다.Latin1 이외의 문자와 특정 특수 문자는 Java™ 언어 사양 섹션 3.3에 정의된 대로 유니코드 이스케이프를 사용하여 키 및 요소로 표시됩니다.
언급URL : https://stackoverflow.com/questions/4659929/how-to-use-utf-8-in-resource-properties-with-resourcebundle
'programing' 카테고리의 다른 글
C/C++ 메인 함수의 파라미터는 어디에 있습니까? (0) | 2022.07.07 |
---|---|
Vue 인스턴스의 $on 메서드가 작동하지 않습니다. (0) | 2022.07.07 |
Joda-Time DateTime을 mm/dd/yyyy로만 포맷하는 방법 (0) | 2022.07.07 |
int를 ASCII 문자로 변환합니다. (0) | 2022.07.04 |
Vue.config를 정의하고 사용할 때 camelCase 속성 이름을 사용할 수 없습니다.키코드 (0) | 2022.07.04 |