我正在使用Matlab创建UTF16文本文件,稍后将使用Java进行读取。在Matlab中,我打开名为fileName的文件,并按以下方式写入:
fid = fopen(fileName, 'w','n','UTF16-LE');
fprintf(fid,"Some stuff.");
在Java中,我可以使用以下代码读取文本文件:
FileInputStream fileInputStream = new FileInputStream(fileName);
Scanner scanner = new Scanner(fileInputStream, "UTF-16LE");
String s = scanner.nextLine();
以下是十六进制输出:
偏移量(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 00000000 73 00 6F 00 6D 00 65 00 20 00 73 00 74 00 75 00 66 00 66 00 s.o.m.e. .s.t.u.f.f.
上述方法可以正常工作。但我想使用带有BOM的UTF16编写文件,以使我更加灵活,不必担心大端或小端。在Matlab中,我编写了以下代码:
fid = fopen(fileName, 'w','n','UTF16');
fprintf(fid,"Some stuff.");
在Java中,我将代码更改为:
FileInputStream fileInputStream = new FileInputStream(fileName);
Scanner scanner = new Scanner(fileInputStream, "UTF-16");
String s = scanner.nextLine();
在这种情况下,字符串s是乱码的,因为Matlab没有写入BOM。如果我手动添加BOM,则可以使Java代码正常工作。添加BOM后,以下文件正常工作。
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 00000000 FF FE 73 00 6F 00 6D 00 65 00 20 00 73 00 74 00 75 00 66 00 66 00 ÿþs.o.m.e. .s.t.u.f.f.如何让Matlab输出BOM?我知道我可以单独写出BOM,但我更希望Matlab自动完成。 附言 我从Amro的答案中选出了答案,因为它完美地解决了我提出的问题。
对我来说,一个关键的发现是Unicode标准和UTF(Unicode转换格式)之间的区别(参见http://unicode.org/faq/utf_bom.html)。 Unicode标准为字符提供唯一标识符(代码点)。 UTF提供每个代码点“到唯一字节序列的映射”。由于我使用的字符除了少数情况外都在前128个代码点中,我将转而使用UTF-8,如Romeo建议。 UTF-8受Matlab(下面显示的警告将不需要被抑制)和Java支持,并且对于我的应用程序会生成更小的文本文件。
我抑制了Matlab的警告。
Warning: The encoding 'UTF-16LE' is not supported.
使用
warning off MATLAB:iofun:UnsupportedEncoding;