【问题标题】:Reading a file with unknown encoding读取未知编码的文件
【发布时间】:2015-03-20 06:56:57
【问题描述】:

我使用 libGDX 为 Android 平台开发游戏。在我的游戏中,我必须解析一些包含一些设置(皮肤自定义、用户地图阅读器)的文件。

我当前的代码至少适用于两种编码:utf-8 和 iso-8859-1,但是当我解析 utf-16LE 编码文件时,每个字符之间有一个额外的空格(当我使用 System .out.println())

当我使用 libGDX 时,我使用的是 FileHandle 类 (> FileHandle doc)。我使用带有 .reader(int buffersize) 方法的 BufferedReader 并使用它的 .readLine() 方法。

这是我的测试代码:

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;

import java.io.BufferedReader;


public class TestFileReader {

    private FileHandle skinFile;    // libgdx File like object
    private BufferedReader bR;      // read character-typed files
    private String line;            // for printing each line
    private Boolean loop;

    public TestFileReader() {
        System.out.println("=== Test started ===");
        skinFile = Gdx.files.internal("skin_UTF-8.ini");
        readFile(skinFile);
        skinFile = Gdx.files.internal("skin_UTF-16LE.ini");
        readFile(skinFile);
        System.out.println("=== Test finished ===");
        Gdx.app.exit();
    }

    private void readFile(FileHandle skinFile) {
        try {
            bR = skinFile.reader(1024);     // 1024 is arbitrary
        }
        catch(Exception e) {
            showError("Error (" + e + ")");
        }

        loop = true;
        System.out.println("--- read started ---");
        while(loop) {
            try {
                line = bR.readLine();
            }
            catch(Exception e) {
                showError("Unable to read the next line (" + e + ")");
            }

            if(line == null) {
                // read finished
                loop = false;
            }
            else {
                // parsing
                line.trim();
                System.out.println("[" + line + "]");
            }
        }
        System.out.println("--- read finished ---");
    }

    private void showError(String error) {
        System.out.println("[Parser] " + error);
        Gdx.app.exit();
    }
}

我的两个文件包含这个:

This
is
a
test
H3ll0
WORLD
&é"'(§è!çà)-
àà`zè`r´róíú

并且执行将打印这个(并且不能复制/粘贴,我认为某处有一个空字节):

我希望能够读取所有编码未知的文件(至少是主要文件)。我做错了什么? (我是 libGDX 和 Java 的初学者)

【问题讨论】:

  • 你应该有办法知道什么是编码存储它,或者让用户传递它等等。据我所知,没有确定任何编码的通用方法。如果解决方案只是存储那种编码类型的信息,为什么会有那么复杂的东西......
  • 顺便说一句,您的实现适用于 UTF-8 和 ISO-8859-1,因为它们在设计上是兼容的。
  • 感谢您的链接!我期待着学习如何检测编码。也许这是处理给定文件的正确方法。 @concept3d 实际上,文件可以采用各种编码,由最终用户确定,而不是我。我只会强迫最终用户给我一个 utf-8 文件。感谢您的回答。
  • 您可以使用 Libgdx 提供的 Preferences api 来处理应用程序的配置设置,而不是处理低级文件格式问题。 (如果你没有比存储字符串值更高级的东西)

标签: java libgdx file-format


【解决方案1】:

在 utf16 文件中打印的前 2 个字符是 BOM。使用它,您可以决定使用哪种编码(缺少哪种编码可能表示 UTF8 兼容编码)

【讨论】:

  • 没错,但问题是BOM是可选的。
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 2016-04-09
  • 2011-09-03
  • 1970-01-01
  • 2021-04-29
相关资源
最近更新 更多