Как мне читать и писать кодировку UTF-8 из папки ресурсов Java? У меня есть код, но он не работает. Я получаю «D’nde est» / Д’нде

  private void CopyAssets2() {
    AssetManager assetManager = getAssets();
    String[] files = null;
    try {
        files = assetManager.list("");
    } catch (IOException e) {
        Log.e("File Error", e.getMessage());
    }
    for (String filename : files) {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = assetManager.open(filename);
            out = new FileOutputStream("/sdcard/Translate/" + filename);
            copyFile2(in, out);
            in.close();
            in = null;
            out.flush();
            out.close();
            out = null;
        } catch (Exception e) {
            Log.e("Save Error", e.getMessage());
        }
    }
}

private void copyFile2(InputStream in, OutputStream out)
            throws IOException {
    char[] buffer = new char[1024];
    Reader reader = new BufferedReader( new InputStreamReader(in, "UTF-8"));

    Writer writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));

    int read;
    while ((read = reader.read(buffer)) != -1) {
        writer.write(buffer, 0, read);
    }
    reader.close();
    writer.flush();
    writer.close();
}

Я получаю входной поток с помощью assetsManager и передаю его как параметр читателя с указанной кодировкой UTF-8. Я также пишу в путь к файлу outputstream с помощью записи в UTF-8.

Файл читается и пишется, но кодировка все равно неправильная. Я получаю такие символы: Где... = «D�nde est» / D�nde

Что я делаю неправильно?


person Evans Kakpovi    schedule 21.06.2012    source источник
comment
предоставил вам решение здесь [форматы чтения текстового файла UTF-8] [1] [1]: stackoverflow.com/questions/9946817/   -  person Muhammad Usman Ghani    schedule 27.02.2014


Ответы (1)


Вы уверены, что входной файл закодирован в UTF-8? �, который вы видите в выводе, — это символ, который используется в качестве замены для последовательностей байтов, которые не могут быть преобразованы в символы при чтении.

Вы можете сделать двоичную копию вместо декодирования и кодирования текста:

byte[] buffer = new byte[1024];

InputStream reader = new BufferedInputStream(in);

OutputStream writer = new BufferedOutputStream(out);

int read;
while ((read = reader.read(buffer)) != -1) {
    writer.write(buffer, 0, read);
}
person Joni    schedule 22.06.2012