簡體   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