Перекодировка текстовых файлов в 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