为什么以 2 种不同方式解码的文本在 GWT 中不匹配?

Why does this text decoded in 2 different ways not match in GWT?

我一直在努力寻找为什么我的俄语翻译在我的游戏的 GWT 版本中没有正确显示。我已将其缩小为文件解码出现问题。此代码在 GWT 环境之外也能正常工作。

我为此测试从字符串创建了 UTF-8 字节数组。下面的方法将文本的两个实例输出到日志中。第一个使用 new String(bytes) 并给出正确的输出,第二个使用 BufferedReader 并产生错误的输出。可以看出两个文件的差异here.

我用于本地化的 类 使用的是 ByteBuffer 方法,因此输出的俄语翻译文本不正确,我很难理解原因。

public void test(){
    String text = "# suppress inspection \"UnusedProperty\" for whole file\n" +
            "\n" +
            "# Notes\n" +
            "# I used the phrase \"Power Flower\" in English as it rhymes. They can be called something else in other languages.\n" +
            "# They're \"fleurs magiques\" (Magic Flowers) in French.\n" +
            "\n" +
            "# Tutorials\n" +
            "#-----------\n" +
            "Tutorial_1_1=Составляй слова, проводя пальцем по буквам.Сейчас попробуй создать слово  'СОТЫ'\n" +
            "Tutorial_1_2=Ты можешь складывать слова справа налево. Попробуй составить слово 'ЖАЛО' справа налево\n" +
            "Tutorial_1_3=Слова могут распологаться сверху вниз, снизу вверх, справа налево, слева направо, а также по диагонали.\n" +
            "Tutorial_1_4=Создавая слова, ты можешь изменять направление.Составь слово 'ВОСК'\n" +
            "Tutorial_1_5=Ты даже можешь пересекать свое собственное слово. Тем не менее, используй каждую букву только один раз. А сейчас, сложи слово 'УЛЕЙ'\n" +
            "Tutorial_1_6=Чем длиннее окажется твоё слово, тем больше у тебя шансов получить много очков и возможность заработать Чудо-Цветок. Составь слово 'ПЧЕЛА'\n" +
            "Tutorial_1_7=Получи Чудо-Цветы за каждое слово из пяти или более букв. Они могут быть использованы в качестве любой из букв.\n" +
            "Tutorial_1_8=Составь слово 'СТЕБЕЛЬ'\n" +
            "Tutorial_1_9=Из разных по длине и форме слов получаются разные Чудо-Цветы.\n" +
            "Tutorial_1_10=Теперь ты справишься сам. Составь еще четыре слова, чтобы уровень был пройден";

    // This defaults to the default charset, which in my instance, and most probably yours is UTF-8
    byte[] bytes = new byte[0];
    try {
        bytes = text.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    String test = new String(bytes);
    // This is correct
    Gdx.app.log("File1", test);

    ByteArrayInputStream is = new ByteArrayInputStream(bytes);
    InputStreamReader reader = null;
    try {
        reader = new InputStreamReader(is, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    BufferedReader br = new BufferedReader(reader);
    StringBuilder fileContents = new StringBuilder();
    String line;
    try {
        while ((line = br.readLine()) != null) {
            fileContents.append(line + "\r\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    // This is incorrect
    Gdx.app.log("File2", fileContents.toString());
}

看起来 ByteArrayInputStreamBufferedReader 部分字符串正在被 UTF-8 解码器解码,这会破坏结果。这似乎是一个 GWT 问题。