Как определить кодировку файла в Octave? - PullRequest
1 голос
/ 21 мая 2019

Я работаю со многими файлами XML, и некоторые из них имеют формат UTF-8, а большинство - ANSI.

В файлах UTF-8 заголовок XML гласит:

<?xml version="1.0" encoding="ISO8859-1" ?>

Однако эта информация неверна.

Проблема, с которой это связано, заключается в том, что я использую unicode2native для создания правильных файлов XLS, что приводит к неправильному выводу, когда файл кодируется в кодировке UTF-8.

Как я могу определить, какая реальная кодировка каждого файла программно?

Ручной поиск их с помощью текстового редактора неосуществим, так как существуют сотни файлов, и мое решение должно работать с большим количеством файлов, к которым у меня нет доступа.

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Нет простого способа сделать это вообще: поскольку данный файл может быть допустимой последовательностью в нескольких кодировках, обнаружение кодировки символов требует использования эвристики, учитывающей особенности естественного языка, такие как частоты символов, общие слова и т. Д. на.

Octave не имеет прямой поддержки для этого. Так что вам нужно будет использовать внешнюю программу или библиотеку. Опции включают в себя ICU4C , compact_enc_det , chardet , juniversalchardet и другие. Вероятно, вам будет проще всего использовать chardet, так как вы можете просто установить его и вызвать как внешнюю команду, а не создавать пользовательскую программу или файл oct с использованием библиотеки. Или juniversalchardet, поскольку, если у вас есть сборка Octave с поддержкой Java, можно легко использовать и использовать библиотеки Java из кода Octave.

Если действительно все ваши входные файлы соответствуют ANSI (Windows 1252 / ISO 8859-1) или UTF-8, а нет других кодировок , вы можете избежать проверки содержимое каждого файла, чтобы увидеть, является ли это допустимой строкой UTF-8, и предположить, что любые, которые не являются допустимыми UTF-8, являются ANSI. Только определенные последовательности байтов являются допустимыми кодировками UTF-8, поэтому есть большая вероятность, что файлы в кодировке ANSI не являются допустимыми UTF-8. Я думаю, что вы можете проверить, является ли файл действительным UTF-8 в чистой Octave, выполнив для него команду utf8_bytes = unicode2native(file_contents, 'UTF-8') и проверив, идентичен ли вывод utf8_bytes простому приведению file_contents непосредственно к uint8. Если это не сработает, вы можете использовать поддержку кодировки символов Java (и это можно сделать с помощью стандартной библиотеки Java в любой сборке Octave с поддержкой Java без необходимости загрузки внешнего файла JAR).

И если все ваши входные файлы имеют либо UTF-8, либо строго 7-битный ASCII, то вы можете просто рассматривать их как UTF-8, потому что 7-битный ASCII является допустимым подмножеством UTF -8.

0 голосов
/ 21 мая 2019

Паллиативное решение, которое я нашел для Windows 10, хотя я не могу найти правильный способ сделать это в чистой октаве:

[~, output] = system(['file --mime-encoding "', fileAddress, '"']);
encoding = strsplit(output)(columns(strsplit(output, ' '))){1};

if strcmp('utf-8', encoding)
  sheet(1, 1) = {strcat('', unicode2native(myText, 'ISO-8859-1'))};
else
  sheet(1, 1) = {myText};
endif
...