我正在使用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();
这是十六进制输出:
Offset(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建议。 Matlab支持UTF-8(下面显示的警告不需要被抑制。)和Java,对我的应用程序将生成较小的文本文件。
我压制了Matlab警告
Warning: The encoding 'UTF-16LE' is not supported.
与
warning off MATLAB:iofun:UnsupportedEncoding;
答案 0 :(得分:4)
在我的系统上,MATLAB报告不支持UTF-16。我认为使用UTF-8会更安全。此外,UTF-8将解决Little Endian / Big Endian的问题。
答案 1 :(得分:2)
请尝试以下代码(我使用UNICODE2NATIVE和NATIVE2UNICODE函数进行转换):
%# convert string and write as bytes
str = 'Some stuff.';
b = unicode2native(str,'UTF-16');
fid = fopen('utf16.txt','wb');
fwrite(fid, b, '*uint8');
fclose(fid);
我们甚至可以检查写入的字节的十六进制值(前两个是BOM):
>> cellstr(dec2hex(b))'
ans =
Columns 1 through 10
'FF' 'FE' '53' '00' '6F' '00' '6D' '00' '65' '00'
Columns 11 through 20
'20' '00' '73' '00' '74' '00' '75' '00' '66' '00'
Columns 21 through 24
'66' '00' '2E' '00'
>> char(b)
ans =
ÿþS o m e s t u f f .
现在我们可以使用MATLAB自己的方法读取创建的文件:
%# read bytes and convert back to Unicode string
fid = fopen('utf16.txt', 'rb');
b = fread(fid, '*uint8')'; %'
fclose(fid);
str = native2unicode(b,'UTF-16')
如果您愿意,可以直接使用Java方法:
scanner = java.util.Scanner(java.io.FileInputStream('utf16.txt'), 'UTF-16');
str = scanner.nextLine()
scanner.close()
两者都应正确读取字符串...
答案 2 :(得分:0)
当我尝试你的命令时:
fid = fopen(fileName, 'w', 'n', 'UTF16');
这就是我所看到的:
>> fid = fopen('foo.txt', 'w', 'n', 'UTF16');
Warning: The encoding 'UTF-16' is not supported.
See the documentation for FOPEN.
您确定以您想要的方式成功打开文件吗?你是否可能在某处吞下警告信息?