Я создаю текстовые файлы 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 сделал это автоматически.
Добавление
Я выбрал ответ ниже из 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;