Java 导出 ANSI 文件而不是 UTF-8

Java exports ANSI file instead of UTF-8

提问人:MustafaEsatTemel 提问时间:9/29/2022 最后编辑:Mark RotteveelMustafaEsatTemel 更新时间:9/29/2022 访问量:425

问:

我正在尝试使用 FileOutputStream 创建一个文件,但它总是创建如下图所示的 ANSI 格式。我在 Eclipse 和 IntelliJ 上进行了所有字符编码设置,但仍然是同样的问题。

Character problems on ANSI

这是我的代码:

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;

class Student implements Serializable{  
int id;  
 String name;  
 public Student(int id, String name) {  
  this.id = id;  
  this.name = name;  
 }  
}
public class sss {
     public static void main(String args[]){    
          try{    
          //Creating the object    
          Student s1 =new Student(211,"ravi");    
          //Creating stream and writing the object    
          FileOutputStream fout=new FileOutputStream("f.txt");    
          ObjectOutputStream out=new ObjectOutputStream(fout);    
          out.writeObject(s1);    
          out.flush();    
          //closing the stream    
          out.close();    
          System.out.println("success");    
          }catch(Exception e){System.out.println(e);}    
         }    
    
}
Java UTF-8 编码 ANSI

评论

1赞 Mark Rotteveel 9/29/2022
您正在编写二进制文件,而不是文本文件。 用于 Java 对象的二进制序列化格式。ObjectOutputStream

答:

1赞 Joop Eggen 9/29/2022 #1

不要在那里使用;这适用于二进制 Java 对象。 避免可序列化;它实际上已被弃用。此外,Serializable 还存储类数据。ObjectOutputStream

try (FileOutputStream fout=new FileOutputStream("f.txt")) {
    fout.write(s1.name.getBytes(StandardCharsets.UTF_8));
} // Closes fout.

“错误”可能是由于最新的 String 类(通常作为 UTF-16 字符数组)将保存 Unicode,也可以保存 ANSI 字节数组。

此外,您对字符串 () 进行硬编码,这意味着保存 java 源代码的编辑器和 javac 编译器必须使用相同的编码来生成 .class 文件。否则,字符串将被损坏。new Student(211,"ravi");

  try {    
      //Creating the object    
      Student s1 = new Student(212, "Jérome");    
      //Creating stream and writing the object    
      Path path = Paths.get("f.txt");    
      Files.writeString(path, s1.name); // Default UTF-8
      path = path.resolveSibling("f-latin1.txt");    
      Files.writeString(path, s1.name, StandardCharsets.ISO_8859_1);
      System.out.println("success");    
  } catch (Exception e) {
      e.printStackTrace(System.out);
  }    

评论

0赞 Mark Rotteveel 9/29/2022
对于您的第一个代码块,使用具有正确字符集并使用 的创建可能比手动将字符串转换为字节并写入这些字符块更好。OutputStreamWriterwrite(String)
0赞 MustafaEsatTemel 9/29/2022
@Joop Eggen,谢谢你的回答。我在一个问题中学到了更多:)
0赞 Joop Eggen 9/29/2022
@MarkRotteveel Student 也有一个 int id,这不是问题的一部分,而是序列化的一部分。所以我保留了一个 FileOutputStream。也许我应该提到一个 DataOutputStream。