有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java修复了字符串中的混合编码

我有一个包含以下字符串的文件:

AAdοbe Dοcument Clοud

如果在记事本++中查看。在十六进制视图中,字符串如下所示:

enter image description here

如果我用Java读取文件,字符串如下所示:

AAdοbe Dοcument Clοud

如何在Java中获得与Notepad++相同的编码


共 (3) 个答案

  1. # 1 楼答案

    您必须使用与文件相同的编码读取java文件

    如果您正在使用非标准编码,甚至尝试使用以下内容读取编码:

    InputStreamReader r = new InputStreamReader(new FileInputStream(theFile));
    r.getEncoding()
    

    可能会输出错误的值

    几乎没有一个库可以更好地处理编码识别:https://code.google.com/archive/p/juniversalchardet/
    它在获得正确编码方面也有一些漏洞,但我已经使用了它
    在使用它时,我发现大多数非标准编码都可以用UTF-16读取,比如:

    new FileReader(fileName, StandardCharsets.UTF_16)
    

    从一段时间以来,Java支持使用UTF-16编码。它在Java标准API中定义为StandardCharsets.UTF_16。该字符集包含许多特定于语言的字符和表情符号

  2. # 2 楼答案

    您的文件编码为UTF-8,CE BF字节是字符ο'GREEK SMALL LETTER OMICRON' (U+03BF))的UTF-8编码

    如果使用记事本++中的Encoding下拉菜单指定UTF-8,则应看到以下内容:

    AAdοbe Dοcument Clοud
    

    你可能想用普通的拉丁字母o('LATIN SMALL LETTER O' (U+006F))来代替希腊字母

    如果决定保留希腊文ο,则需要确保Java程序使用UTF-8读取文件,最好使用以下其中一种方法:

    BufferedReader reader = Files.newBufferedReader(Paths.get("file.txt")); // UTF-8 is the default
    
    BufferedReader reader = Files.newBufferedReader(Paths.get("file.txt"), StandardCharsets.UTF_8);
    

    如果您使用调试器查看文本,您应该看到它现在已被正确读取。如果打印文本,请确保正在使用的控制台窗口可以处理UTF-8字符,否则即使正确读取,也可能打印错误

  3. # 3 楼答案

    您必须在此文件读取器中设置编码

    new FileReader(fileName, StandardCharsets.UTF_8)