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