Перекодировка текстовых файлов в MatLab


Недавно я столкнулась с задачей написания читалки текстовых файлов в MatLab. Проблема была в том, что эти файлы могут быть записаны либо в DOS, либо в Windows.

Если этот файл записан в DOS, то мы увидим такие строчки:
# ’ЂЏЏ. Љ‘-3: ’ЁЇ  ЇЇ а вгал

Я нашла всего две матлабовские команды перекодировки — native2unicode и unicode2native. К сожалению, в хелпе про них всего один скудный пример, а Яndex в рунете вообще ничего не выдает.

Итак, пишем функцию перекодировки.

function out = my_decoder(in)
a = unicode2native(in,'windows-1251');
out = native2unicode(abs(a),'cp-866');


Теперь русские буквы читаются нормально:
# ТАПП. КС-3: Тип аппаратуры

Но если файл был записан в Windows, мы увидим:
# . -3: шя ряярЁрЄєЁ

Чтобы отличить эти две кодировки я буду проверять, есть ли уже в строке русские буквы. Для этого мне нужны матлабовские коды русских букв:
rus = [1040:1103 1025 1105];
1025 и 1105 — это буквы Ё и ё, а от 1040 до 1103 — все остальные.

>> char(rus)
ans =
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяЁё


Чтобы узнать, есть ли в строке русские буквы, я проверяю наличие максимального значения кода символов данной строки в массиве rus: numel(find(rus==max(abs(in))))

В итоге получился такой перекодировщик:

function out = my_decoder(in)
rus = [1040:1103 1025 1105]; % коды русских букв
if numel(find(rus==max(abs(in))))>0 % если есть русские буквы, то не надо перекодировать
out = in;
else % перекодировка из dos (английские буквы при этом не меняются)
a = unicode2native(in,'windows-1251');
out = native2unicode(abs(a),'cp-866');
end