MATLAB: как отобразить кодированный в кодировке UTF-8 текст из файла? - PullRequest
25 голосов
/ 28 июля 2011

Суть моего вопроса такова:

Как я могу отображать символы Юникода в Matlab GUI (OS X), чтобы они правильно отображались?

подробности:

У меня есть таблица строк, хранящаяся в файле, и некоторые из этих строк содержат символы Unicode в кодировке UTF-8. Я пробовал много разных способов (слишком много, чтобы перечислить здесь), чтобы отобразить содержимое этого файла в GUI MATLAB, но безуспешно. Например:

>> fid = fopen('/Users/kj/mytable.txt', 'r', 'n', 'UTF-8');
>> [x, x, x, enc] = fopen(fid); enc

enc =

UTF-8

>> tbl = textscan(fid, '%s', 35, 'delimiter', ',');
>> tbl{1}{1}

ans =

ÎÎÎÎÎΠΣΦΩαβγδεζηθικλμνξÏÏÏÏÏÏÏÏÏÏ
>> 

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

>> pasted = 'ΓΔΘΛΞΠΣΦΩαβγδεζηθικλμνξπρςστυφχψω'

pasted =


>> 

Спасибо!

1 Ответ

34 голосов
/ 29 июля 2011

Я представляю свои выводы после некоторых копаний ... Рассмотрим следующие тестовые файлы:

a.txt

ΓΔΘΛΞΠΣΦΩαβγδεζηθικλμνξπρςστυφχψω

b.txt

தமிழ்

Сначала мы читаем файлы:

%# open file in binary mode, and read a list of bytes
fid = fopen('a.txt', 'rb');
b = fread(fid, '*uint8')';             %'# read bytes
fclose(fid);

%# decode as unicode string
str = native2unicode(b,'UTF-8');

Если вы попытаетесь напечатать строку, вы получите кучу глупостей:

>> str
str =

Тем не менее, str содержит правильную строку. Мы можем проверить код Unicode для каждого символа, который, как вы можете видеть, выходит за пределы диапазона ASCII (последние два - непечатаемые окончания строки CR-LF):

>> double(str)
ans =
  Columns 1 through 13
   915   916   920   923   926   928   931   934   937   945   946   947   948
  Columns 14 through 26
   949   950   951   952   953   954   955   956   957   958   960   961   962
  Columns 27 through 35
   963   964   965   966   967   968   969    13    10

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

figure
text(0.1, 0.5, str, 'FontName','Arial Unicode MS')
title(str)
xlabel(str)

Одна хитрость, которую я нашел, заключается в использовании встроенной возможности Java:

%# Java Swing
label = javax.swing.JLabel();
label.setFont( java.awt.Font('Arial Unicode MS',java.awt.Font.PLAIN, 30) );
label.setText(str);
f = javax.swing.JFrame('frame');
f.getContentPane().add(label);
f.pack();
f.setVisible(true);

enter image description here


Когда я готовился написать выше, я нашел альтернативное решение. Мы можем использовать недокументированную функцию DefaultCharacterSet и установить кодировку на UTF-8 (на моем компьютере это ISO-8859-1 по умолчанию):

feature('DefaultCharacterSet','UTF-8');

Теперь с правильным шрифтом (вы можете изменить шрифт, используемый в окне команд с Preferences > Font), мы можем напечатать строку в приглашении (обратите внимание, что DISP все еще не способен печатать Unicode):

>> str
str =
ΓΔΘΛΞΠΣΦΩαβγδεζηθικλμνξπρςστυφχψω

>> disp(str)
ΓΔΘΛΞΠΣΦΩαβγδεζηθικλμνξπÏςστυφχψω

И для отображения в графическом интерфейсе UICONTROL должен работать (под капотом, я думаю, что это действительно компонент Java Swing):

uicontrol('Style','text', 'String',str, ...
    'Units','normalized', 'Position',[0 0 1 1], ...
    'FontName','Arial Unicode MS', 'FontSize',30)

enter image description here

К сожалению, TEXT, TITLE, XLABEL и т. Д. Все еще показывают мусор:

enter image description here


В качестве примечания: в редакторе MATLAB сложно работать с источниками m-файлов, содержащими символы Unicode. Я использовал Блокнот ++ , с файлами, закодированными как UTF-8 без спецификации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...