JAVA Files.readAllBytes() 不更改字符集

标签 java encoding utf-8 character-encoding

我有一个文件,其中包含一些我想要更改的纯文本。然而,该文件的大部分内容对于人类来说是无法读取的。

我首先使用UTF-8作为字符集,它找到了我想要替换的文本,正确地替换/更改了它并将所有这些写入到一个新文件中。但我遇到了两个问题:大小几乎是原始文件的两倍,而且其他应用程序也无法读取它。然后我尝试使用 ISO-8859-1 进行相同的操作,这导致文件大小比 UTF-8 更接近原始文件 - 但使用计划文本编辑器打开并比较文件表明 ISO-8859-1 也“被误解”,因此向文件中添加了一些字节。对于能够打开原始文件 (MP4) 的应用程序来说,该文件也无法读取

我所做的如下:

       String content;
        try {
            content = new String(Files.readAllBytes(path), ("ISO-8859-1"));
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        content = content.replaceAll("\"enabled\": false", "\"enabled\": true");
        try {
            Files.write(pathDestination, content.getBytes("ISO-8859-1"));
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

我很确定,如果我只是让我的应用程序在没有任何字符集的情况下“逐字节”读取它,我可以“保留”完全相同的文件,但随后我还必须将所有字节转换为 UTF-8 block text 以便查找并替换该文件中的纯文本,然后再次将其转回字节数据以便将所有这些解析到新文件中。必须有更好的解决方案!

仅举一个例子:

!7S€ÇŸ 变为

!/S”Ç—(包括连字符),以防万一它的显示与我上传的屏幕截图相同

enter image description here

最佳答案

如果文件仅包含一些纯文本,并且其中大部分内容不打算作为字符读取,那么您应该只将文件中纯文本的部分转换为 String。将任意非文本字节转换为 String 确实不是一个好主意。

I am pretty sure I could "keep" the exact same file if I just made my application read it "byte by byte" without any charsets, but then I also would have to convert all the bytes into blocks of UTF-8 text in order to find and replace the plain text in that file, just before turning it back into byte-wise data again in order to parse all this into the new file. There must be a better solution for this!

那么您应该注意文件的实际格式。完全有可能某些随机字节 block (视频或音频,如果文件是 MP4,如您所说)只是随机地与您正在查找的文本匹配。这并不意味着您应该更改这些字节。

如果您愿意接受这种风险,那么也许您应该将搜索文本转换为字节并搜索这些字节,而不是将要搜索的字节转换为文本。但这意味着您不能使用 replaceAll;您必须实现自己的字节替换实现。不过,这可能仍然更正确。

关于JAVA Files.readAllBytes() 不更改字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32125579/

相关文章:

java - AssertionError 的 getMessage() 奇怪地为 null

python - 列表的 Pandas 列分隔列

python - 在 Python 中处理 `
`

php - GD 库 imagettftext 在古吉拉特语文本中出现问题

mysql - 使用 iconv 转换 mysqldump-ed 数据库

java - 在没有公共(public)接口(interface)的情况下调用公共(public)方法

java - 从 JNI 使用 GetDirectBufferAddress

utf-8 - 如何确定文件编码?

java.util.TreeMap 行为问题

php - 如何将非 utf-8 字符串转换为 utf-8