Как заставить Matlab записывать спецификацию (маркеры порядка байтов) для текста UTF-16 files?

Я создание текстовых файлов UTF16 с помощью Matlab, которые я позже читаю, используя 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.

Вышеупомянутый подход отлично работает . Но я хочу иметь возможность записывать файл, используя 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 не записывает спецификацию. Я могу заставить код Java работать нормально, если добавлю спецификацию вручную. С добавленной спецификацией следующий файл работает нормально.

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 выписать спецификацию? Я знаю, что могу написать спецификацию отдельно, но я бы предпочел, чтобы Matlab делал это автоматически.

Приложение

Я выбрал ответ ниже из Амро , потому что он точно решает поставленный мною вопрос.

Одним из ключевых открытий для меня была разница между стандартом 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;

7
задан Community 23 May 2017 в 11:47
поделиться