JAR 无法正确编码语言

JAR not able to encode languages properly

我正在使用 Javalin 构建网络应用程序。一切正常,直到我直接从命令提示符开始 运行ning JAR。我注意到所有表情符号、国际语言和自定义字体都显示为“??????”在我的 JSON 回复中。所以我开始在我的主要方法中使用一个简单的字符串进行测试并尝试在控制台中打印出来,这是我得到的结果:

public class App {

        public static void main(String[] args) {

                String myString = "Привет мир . مرحبا بالعالم .Olá Mundo";

                byte bytes[] = myString.getBytes("ISO-8859-1"); 
                String value = new String(bytes, "UTF-8"); 

                byte bytes2[] = myString.getBytes("UTF-8"); 
                String value2 = new String(bytes2, "UTF-8"); 

                System.out.println("value: " + value);
                System.out.println("value 2: " + value2);
        }

} 

尝试#1 java -jar app.jar 试试#2 java -Dfile.encoding=UTF-8 -jar app.jar 这是我为两个命令获得的输出:

value: ??Ñ????²?µÑ? ?¼??Ñ? . ???±?????? ?????????????? .Ol?¡ Mundo
value2: ????????? ???? . ?????? ?????????? .Olá Mundo

我完成了这个 answer 以达到这一点

我注意到当我从 gradle 任务中 运行 时不会出现此问题,但只要我直接使用 jar 就会导致此问题。请注意,这是我第一次在后端使用 Java。我主要是一名 Node JS 开发人员,管理表情符号和国际字体不是什么大问题。任何帮助将不胜感激。谢谢

更新

我用 API

测试了这个

App.java

public class App {
        public static void main(String[] args) {
            Javalin app = Javalin.create().start(7000);
            app.get("/api/test", Models::config);
        }
}

Models.java

public class Models {
        public static void config(Context context) {
            String myString = "Привет мир . مرحبا بالعالم .Olá Mundo";
            byte[] bytes2 = myString.getBytes();
            String value2 = new String(bytes2, StandardCharsets.UTF_8);

            context.result(value2);
        }
}

现在 运行ning jar 在浏览器中给出了这个输出:

?????? ??? . ????? ??????? .Olá Mundo

如果 运行 使用命令 #2 宁 jar 那么这是输出:

ะ?ั?ะธะฒะตั? ะผะธั? . ู?ุฑุญุจุง ุจุงู?ุนุงู?ู? .Olรก Mundo

原来我创建 fatJar 的方式导致了这个问题。我将其更改为使用 shadowJar 插件,现在一切正常,除了带有自定义字体的文本被格式化为普通文本。这对我来说很好。

plugins {
    id 'application'
    id "com.github.johnrengelman.shadow" version "7.1.2" //use this for fatjar
}

然后

jar {
    manifest {
        attributes 'Main-Class': 'com.example.myapp.App'
    }
}

最后使用此命令构建 jar:

gradle shadowJar