使用java中的RandomAccessFile编写非英语字符

使用java中的RandomAccessFile编写非英语字符,java,character-encoding,randomaccessfile,Java,Character Encoding,Randomaccessfile,我试图使用RandomAccessFile对象将一些文本写入文件,但非英语字符未正确保存 具体地说,这句话-->“und NotenstEnder Libero” 是这样保存的-->“und Notenst•under Libero” 其中“E”字符不是英语(我想ascii码是917) 我使用的代码如下: file = new RandomAccessFile(path, "rw"); ... file.seek(file.length()); file.writeBytes("The data

我试图使用RandomAccessFile对象将一些文本写入文件,但非英语字符未正确保存

具体地说,这句话-->“und NotenstEnder Libero”

是这样保存的-->“und Notenst•under Libero”

其中“E”字符不是英语(我想ascii码是917)

我使用的代码如下:

file = new RandomAccessFile(path, "rw");
...
file.seek(file.length());
file.writeBytes("The data i want");
如何避免这种情况并写出正确的文本


(注:我知道file.writeChars,我想知道是否还有其他方法!)

主要问题可能是您的文件编码。您应该使用正确的编码(可能是UTF-8),例如:


请注意,如果您使用文本查看器/编辑器检查文件,根据您使用的文本查看器/编辑器的不同,您可能必须在文件开头写入UTF-8字节顺序标记,或者如果查看器/编辑器无法自行识别,则告诉其使用UTF-8。

主要问题可能是您的文件编码。您应该使用正确的编码(可能是UTF-8),例如:


请注意,如果您使用文本查看器/编辑器检查文件,根据您使用的文本查看器/编辑器的不同,您可能需要在文件的开头写一个UTF-8字节顺序标记,或者告诉查看器/编辑器如果无法自己理解,就使用UTF-8。

您希望Java代码是UTF-8。如果使用unicode\unnn对字符进行编码,则可以使用任何unicode字符

下面是您将如何对示例进行编码:

String spanish = "\u00E1\u00E9\u00ED\u00F3\u00FA";
System.out.println(spanish); // prints áéíóú

您希望您的Java代码是UTF-8。如果使用unicode\unnn对字符进行编码,则可以使用任何unicode字符

下面是您将如何对示例进行编码:

String spanish = "\u00E1\u00E9\u00ED\u00F3\u00FA";
System.out.println(spanish); // prints áéíóú

你是说希腊字母Ε(希腊大写字母EPSILON)而不是拉丁字母E(拉丁大写字母E)

除了可以工作的
writeChars()
,还有一种方法也可以工作。它将根据字符代码使用可变的字节数,而不是每个字符写入两个字节


文件存储字节。文本是一系列字符;在Java中,
char
是两个字节。您必须指定在字符和字节之间进行转换的多种方法中的一种。一些方法(如UTF-8)处理任何字符,而许多其他方法仅处理特定的字符子集,如拉丁语或西里尔语。您必须选择一种字符编码,然后跟踪您使用的编码,以便以后可以解码文件。

您是指希腊字母Ε(希腊大写字母EPSILON)而不是拉丁字母E(拉丁大写字母E)

除了可以工作的
writeChars()
,还有一种方法也可以工作。它将根据字符代码使用可变的字节数,而不是每个字符写入两个字节


文件存储字节。文本是一系列字符;在Java中,
char
是两个字节。您必须指定在字符和字节之间进行转换的多种方法中的一种。一些方法(如UTF-8)处理任何字符,而许多其他方法仅处理特定的字符子集,如拉丁语或西里尔语。您必须选择一种字符编码,然后跟踪您使用的编码,以便以后对文件进行解码。

writeBytes(字符串s):字符串中的每个字符都是通过丢弃其高8位按顺序写出的,因此这就像使用ASCII编码writeBytes(字符串s):字符串中的每个字符都是按顺序写出的,通过丢弃它的高8位,就像使用ASCII编码一样,我可以将writeBytes与单个字符串一起用作属性,但不能与(byte[],int,int)一起使用。有我应该安装的库吗?@MaRiOs-oops,对不起,这是一个输入错误。它
s
write(byte[],int,int)`甚至
write(byte[])
委托给内部方法
writeBytes(byte[],int,int)
传递0和b.length。非常感谢!成功了。我想现在我应该改变我读取文件的方式了?因为我写的是我想要的文本,但当我读到它时,我仍然有非拉丁字符的问题。(我正在用file.readline()阅读)@MaRiOs是的,如果你知道文件的编码,你应该在阅读文件时使用它。一般来说,建议使用已定义的endcoding,而不是依赖系统编码(许多IO方法都是这样做的,但幸运的是它们通常有对应的方法,允许您指定编码)。我可以将writeBytes与单个字符串一起用作属性,但不能与(byte[],int,int)一起使用。有我应该安装的库吗?@MaRiOs-oops,对不起,这是一个输入错误。它
s
write(byte[],int,int)`甚至
write(byte[])
委托给内部方法
writeBytes(byte[],int,int)
传递0和b.length。非常感谢!成功了。我想现在我应该改变我读取文件的方式了?因为我写的是我想要的文本,但当我读到它时,我仍然有非拉丁字符的问题。(我正在用file.readline()阅读)@MaRiOs是的,如果你知道文件的编码,你应该在阅读文件时使用它。一般来说,建议使用已定义的endcoding,而不是依赖系统编码(许多IO方法都是这样做的,但幸运的是,它们通常有对应的方法,允许您指定编码)。