为什么以 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());
}
看起来 ByteArrayInputStream
和 BufferedReader
部分字符串正在被 UTF-8 解码器解码,这会破坏结果。这似乎是一个 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());
}
看起来 ByteArrayInputStream
和 BufferedReader
部分字符串正在被 UTF-8 解码器解码,这会破坏结果。这似乎是一个 GWT 问题。