java解码windows-1251 rtf到utf-8

siotufzp  于 2021-07-12  发布在  Java
关注(0)|答案(0)|浏览(228)

我有一个 .rtf 文件。文件在中 windows-1251 编码。
我需要将这个字符串保存到另一个文件中,并且我需要将它保存到 utf-8 编码。我需要这个文件有很好的可读性。
所以,我尝试了很多变体,我阅读了java文档和其他源代码,我花了2天时间寻找答案,但仍然无法将其转换为可读性良好的文件
这是一个带有这个字符串的文件,你可以下载它来运行我的测试
这是文件的图像内容

这是我的java测试,您可以使用它并尝试转换文件
这是一个简短的案例,我的代码从文件

@Test
public void windows1251toUtf8() throws IOException {
    //Prepare file
    File dir = new File("/tmp/TESTS/");
    if (!dir.exists() && !dir.mkdirs()) {
        throw new RuntimeException("Cant create destination dir");
    }
    File destination = new File(dir, "test.rtf");
    if (!destination.exists() && !destination.createNewFile()) {
        throw new RuntimeException("Cant create destination file");
    }

    //-----------------------------------------------------------------------------------------

    //Not work
    InputStream inputStream = getClass().getClassLoader().getResourceAsStream("utils/encoding/windows1521File.rtf");
    Scanner sc = new Scanner(inputStream, "WINDOWS-1251");
    StringJoiner stringBuilder = new StringJoiner("\n");
    while (sc.hasNextLine()) {
        stringBuilder.add(sc.nextLine());
    }

    String text = decode(stringBuilder.toString(), "WINDOWS-1251", "UTF-8");

    byte[] bytes = text.getBytes(Charset.forName("UTF-8"));

    Files.write(bytes, destination);

    //-----------------------------------------------------------------------------------------

    //Not work
    URL resource = getClass().getClassLoader().getResource("utils/encoding/windows1521File.rtf");
    String string = FileUtils.readFileToString(new File(resource.getPath()), Charset.forName("WINDOWS-1251"));

    byte[] bytes = convertEncoding(string.getBytes(), "WINDOWS-1251", "UTF-8");

    FileUtils.writeByteArrayToFile(destination, bytes);

    //-----------------------------------------------------------------------------------------

    //Not work
    InputStream inputStream = getClass().getClassLoader().getResourceAsStream("utils/encoding/windows1521File.rtf");

    byte[] bytes = IOUtils.toByteArray(inputStream);
    String s = new String(bytes);
    byte[] bytes2 = s.getBytes("WINDOWS-1251");

    FileUtils.writeByteArrayToFile(destination, bytes2);
}

public static byte[] convertEncoding(byte[] bytes, String from, String to) throws UnsupportedEncodingException {
    return new String(bytes, from).getBytes(to);
}

public static String decode(String text, String textCharset, String resultCharset) {
    if (StringUtils.isEmpty(text)) {
        return text;
    }

    try {
        byte[] bytes = text.getBytes(textCharset);
        ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
        byte[] tmp = new byte[bytes.length];
        int n = inputStream.read(tmp);
        byte[] res = new byte[n];
        System.arraycopy(tmp, 0, res, 0, n);
        return new String(res, resultCharset);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

在所有情况下,结果,我抓住了这样的东西

或者像这样

有什么办法可以转换吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题