繁体   English   中英

您如何让Matlab为UTF-16文本文件编写BOM(字节顺序标记)?

[英]How do you get Matlab to write the BOM (byte order markers) for UTF-16 text files?

我正在使用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();

is garbled, because Matlab is not writing the BOM. 在这种情况下,字符串会出现乱码,因为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。 Matlab支持UTF-8(不需要取消显示以下警告。)和Java,对于我的应用程序,它会生成较小的文本文件。

我禁止Matlab警告

Warning: The encoding 'UTF-16LE' is not supported.

warning off MATLAB:iofun:UnsupportedEncoding;

在我的系统上,MATLAB报告不支持UTF-16。 我认为使用UTF-8更安全。 此外,UTF-8将使用Little Endian / Big Endian解决您的问题。

尝试以下代码(我正在使用UNICODE2NATIVENATIVE2UNICODE函数进行转换):

%# 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()

两者都应该正确读取字符串...

当我尝试您的命令时:

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.

您确定已成功按照所需方式打开文件吗? 您可能在某处吞下了警告消息吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM