在UTF-8编码的代码中,使用带重音符号的字符串,该字符串取自以ISO-8859-1编码的文件

时间:2019-09-17 14:52:44

标签: java encoding utf-8

有人问过非常类似的问题,但我找不到解决问题的方法。

我有一个属性文件,即 config.properties 使用ISO-8859-1 进行了以下编码:

config1 = some value with âccénted characters

我有一个加载属性的类和一个获取属性值的方法

public class EnvConfig {
    private static final Properties properties = new Properties();

    static {        
        initPropertiesFromFile();
    }

    private static void initPropertiesFromFile() {
        InputStream stream;

        try {
            stream = EnvConfig.class.getResourceAsStream("/config/config.properties");
            properties.load(new InputStreamReader(stream, Charset.forName("ISO-8859-1")));
            // Tried that as well instead of the previous line: properties.load(stream);
        } catch (Exception e) {
            // Do something
        } finally {
            stream.close();
        }
    }

    public static String getProperty(String key, String defaultValue) {
        try {
            System.out.println(Charset.defaultCharset()); // Prints UTF-8
            // return new String(properties.getProperty(key).getBytes("ISO-8859-1")); // Returns some value with �cc�nted characters
            // return new String(properties.getProperty(key).getBytes("UTF-8")); // Returns some value with �cc�nted characters
            // return new String(properties.getProperty(key).getBytes("ISO-8859-1"), "UTF-8") // Returns some value with �cc�nted characters
            return properties.getProperty(key, defaultValue); // Returns some value with �cc�nted characters
        } catch (Exception e) {
            // Do something
            return defaultValue;
        }
    }
}

我有一些代码可以对属性值(字符串)执行某些操作,并且代码需要带有重音符号的正确字符串:有些值带有âccénted字符

public void doSomething() {
    ...
    EnvConfig.getProperty("config1"); // I need the exact same value as configured in the properties file: some value with âccénted characters; currently get some value with �cc�nted characters
    ...
}

该项目使用UTF-8(Java文件使用UTF-8编码),并且项目属性/设置(pom)设置为UTF-8。

我缺少什么,我该如何实现?我知道没有“ UTF-8格式的字符串”之类的东西,因为字符串只是UTF-16代码单元的序列。但是我如何在我的UTF-8编码的代码/项目中简单地获得与ISO-8859-1编码的属性文件中配置的相同的“可行”输出,即带有重音符号的字符串?

1 个答案:

答案 0 :(得分:1)

经过数小时的搜索,事实证明我的编码问题是由项目的POM中设置为true的资源过滤引起的:

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>

将此设置为false可解决此问题。我仍然需要找到一种使它在启用过滤功能的情况下工作的方法,因此我将尝试解决该问题。其他问题/答案中也有一些线索,例如Wrong encoding after activating resource filtering。谢谢。