在java中将字符串从一种编码解释为另一种编码

我四处寻找答案(我确定他们在那里),我不确定这是可能的。

所以,我收到了一个包含“för”字样的巨大文件。 我正在使用RandomAccessFile,因为我知道它的位置(种类),因此可以使用seek()函数来实现。

要知道我已经找到它,我的程序中有一个字符串“för”,我检查是否相等。 这是问题,我运行调试器,当我得到“för”时,我得到的比较是“för”。

所以我的程序终止而没有找到任何“för”。

这是我用来获取单词的代码:

private static String getWord(RandomAccessFile file) throws IOException { StringBuilder stb = new StringBuilder(); String word; char c; c = (char)file.read(); int end; do { stb.append(c); end = file.read(); if(end==-1) return "-1"; c = (char)end; } while (c != ' '); word = stb.toString(); word.trim(); return word; } 

所以基本上我将所有字符从文件中的当前点返回到第一个”字符。 所以基本上我得到了这个词,但是因为(char)file.read(); 读取一个字节(我认为),UTF-8’ö’成为两个字符’Ã’和’¶’?

这种猜测的一个原因是,如果我用UTF-8编码打开我的文件,它就是“för”,但是如果我在同一个地方用ISO-8859-15打开文件,我们现在就得到了我的getWord方法返回的内容:“fö R”

所以我的问题:

当我坐着“för”和“för”时,有什么方法可以解决这个问题吗? 就像说“读”för“好像是一个UTF-8字符串”得到“för”?

 import java.nio.charset.Charset; String encodedString = new String(originalString.getBytes("ISO-8859-15"), Charset.forName("UTF-8")); 

如果必须使用RandomAccessFile ,则应首先将内容读入byte[] ,然后将完整数组转换为String – somthing沿着以下行:

 byte[] buffer = new byte[whatever]; file.read(buffer); String result = new String(buffer,"UTF-8"); 

这只是为了给你一个普遍的印象,你需要添加一些长度处理等。

如果您在UTF-8序列的中间开始阅读,这将无法正常工作,但任何其他方法也将如此。

您正在使用RandomAccessFile.read() 。 这读取单个字节。 UTF-8有时会为一个字符使用几个字节。

这里讨论从RandomAccessFile读取UTF-8的不同方法: Java:从具有缓冲输入的随机访问文件中读取字符串

如果您不一定需要RandomAccessFile,那么绝对应该切换到读取字符而不是字节

如果可能的话,我建议Scanner.next()默认搜索下一个单词。