Matlab в Linux (Ubuntu 11.10) не отображает Unicode (иврит) на графике

Я пытаюсь использовать символы иврита в графике рисунка Matlab на моем Ubuntu безрезультатно. Я пытался:

text(0.6,0.5,'ירוק','fontname','times new roman','rotation',180,'fontsize',50,'color','r')

и

title('ירוק','fontname','times new roman','fontsize',50,'color','r')

аналогично тому, что было предложено в ответе на этот вопрос. Я получил искаженный текст (см. прикрепленное изображение).

Matlab находится в версии R2009b. Конечно, я настроен на кодировку UTF-8.

>> slCharacterEncoding

ans =

UTF-8

У меня также есть доступ к удаленному компьютеру по ssh, с версией R2011a. Это тоже не сработало. (Там мне пришлось slCharacterEncoding('UTF-8'))

Другой вариант, использующий компонент javax.swing.JLabel, слишком сложен для использования с тем объемом графиков, который у меня есть.

Я могу продолжать делать графики с английскими осями и заголовками, но жаль. Любой совет?


Редактировать: как предложил Эгон, если я смогу print -deps, а затем заменить текст (из кода в Matlab) в результирующем файле EPS, это тоже довольно круто. Но я не знаю, как поместить Unicode в EPS, и я думаю, что это растягивает...

Снимок экрана с изображением мусора


Еще одно редактирование: я начинаю думать, что это проблема X-сервера. Хотя это и отличается, я не удивлюсь, если эти проблемы связаны:

Я попытался удалить поставляемые Ubuntu драйверы NVidia (у меня карта 9300GS) и переустановить поставляемые NVidia (v295). Я попытался изменить DPI в xorg.conf на "100 x 100". Установил все пакеты, перечисленные в HebrewLocalizationHowto, а затем некоторые. Ничего не сработало. Предложения?


Другое изменение. Шрифты, расположенные под matlab/sys/fonts/ttf или matlab/sys/fonts/type1, отображаются неправильно. Когда я редактирую рисунок и дважды щелкаю заголовок, я вижу, что символы есть, но когда я заканчиваю редактирование, он возвращается к плохому отображению. Кроме того, предложено решение JLabel для отображения символов Unicode. здесь правильно отображает текст под той же фигурой.

Другое редактирование Matlab R2011a демонстрирует ту же проблему. Вот результат listfonts

>> listfonts

ans = 

    'aharoni'
    'andale mono'
    'anka clm'
    'arial'
    'arial black'
    'avant garde gothic'
    'AvantGarde'
    'batang'
    'bitstream charter'
    'biwidth'
    'Bookman'
    'caladings'
    'century schoolbook l'
    'charter'
    'clean'
    'clearlyu'
    'clearlyu alternate glyphs'
    'clearlyu arabic'
    'clearlyu arabic extra'
    'clearlyu devanagari'
    'clearlyu devangari extra'
    'clearlyu ligature'
    'clearlyu pua'
    'cmex10'
    'cmmi10'
    'cmr10'
    'cmsy10'
    'comic sans ms'
    'comix no2 clm'
    'Courier'
    'courier 10 pitch'
    'courier new'
    'dingbats'
    'dorian clm'
    'dotum'
    'drugulin'
    'ellinia'
    'fangsong ti'
    'fixed'
    'frank ruehl'
    'gan clm'
    'georgia'
    'gladia clm'
    'gothic'
    'Helvetica'
    'Helvetica-Narrow'
    'impact'
    'itc avant garde gothic'
    'itc bookman'
    'itc zapf chancery'
    'itc zapf dingbats'
    'ktav yad clm'
    'latin modern roman'
    'latin modern sans'
    'latin modern sansquotation'
    'latin modern typewriter'
    'latin modern typewriter variable width'
    'lucida'
    'lucida bright'
    'lucidabright'
    'lucidasans'
    'lucidasans typewriter'
    'lucidatypewriter'
    'mincho'
    'msam10'
    'msbm10'
    'nachlieli'
    'new century schoolbook'
    'newcenturyschlbk'
    'NewCenturySchoolBook'
    'newspaper'
    'nil'
    'nimbus mono l'
    'nimbus roman no9 l'
    'nimbus sans l'
    'open look cursor'
    'open look glyph'
    'ozrad clm'
    'Palatino'
    'song ti'
    'standard symbols l'
    'Symbol'
    'terminal'
    'texgyreadventor'
    'texgyrebonum'
    'texgyrecursor'
    'texgyreheros'
    'texgyrepagella'
    'texgyreschola'
    'texgyretermes'
    'Times'
    'times new roman'
    'trebuchet ms'
    'urw bookman l'
    'urw chancery l'
    'urw gothic l'
    'urw palladio l'
    'verdana'
    'wasy10'
    'webdings'
    'yehuda'
    'zapf chancery'
    'zapf dingbats'
    'ZapfChancery'
    'ZapfDingbats'

person Yuval    schedule 02.03.2012    source источник
comment
Вы шутите? Я ссылался на этот вопрос в своем...   -  person Yuval    schedule 03.03.2012
comment
Вы пробовали другие шрифты? Ваша копия Times New Roman может не содержать этих символов или иметь неверные кодовые точки. (Помимо того, что это довольно уродливый шрифт, имхо, во всяком случае.) Из вашего списка я бы начал с 'yehuda', так как это звучит так, как будто он должен содержать буквы иврита.   -  person Christopher Creutzig    schedule 09.04.2012


Ответы (2)


Вы пробовали отключить интерпретатор текста?

Поэтому либо добавьте 'interpreter', 'none' в качестве последних нескольких аргументов вашего вызова text, либо установите это для всей фигуры set(gcf,'defaulttextinterpreter','none'). Чтобы применить это глобально, просто замените gcf на 0 (это корневое окно).

Если это не сработает, вы можете попробовать интерпретатор LateX (замените none на «латекс» выше), который может поддерживать символы иврита.

С другой стороны, но это личные предпочтения, английские этикетки позволяют (практически) любому читать ваши цифры, что позволяет вам только обмениваться идеями с другими людьми.

edit Как сказано в вопросе, на который вы ссылались, это проблема шрифта, а не проблема MATLAB. Я попробовал это здесь, на моей установке Arch (у которой есть свои собственные проблемы со шрифтами), но я могу заставить его отлично отображать ваши символы иврита, используя шрифт Arial.

Доказательство иврита

edit 2 Опять же, это проблема со шрифтом, а не с MATLAB. Я снова попробовал это при установке Arch, и теперь иврит отлично работает с вашим первым кодом. Поэтому я предполагаю, что установленные вами шрифты не являются правильными версиями.

введите здесь описание изображения

В Arch у меня установлены следующие пакеты, связанные со шрифтами:

extra/cantarell-fonts 0.0.7-1
extra/font-bitstream-speedo 1.0.1-2
extra/fontsproto 2.1.2-1
extra/gsfonts 1.0.7pre44-3
extra/sdl_ttf 2.0.11-2
extra/t1lib 5.1.2-3
extra/ttf-bitstream-vera 1.10-8
extra/ttf-dejavu 2.33-2
extra/ttf-freefont 20100919-2
extra/xorg-font-util 1.3.0-1
extra/xorg-fonts-100dpi 1.0.1-4
extra/xorg-fonts-75dpi 1.0.1-4
extra/xorg-fonts-alias 1.0.2-2
extra/xorg-fonts-encodings 1.0.4-3
extra/xorg-fonts-misc 1.0.1-2
extra/xorg-fonts-type1 7.4-2
extra/xorg-mkfontscale 1.1.0-1
extra/xorg-xfontsel 1.0.4-1
extra/xorg-xlsfonts 1.0.3-2
community/ttf-liberation 1.07.2-1
aur/ttf-microsoft-wingding 1.55-1
aur/ttf-ms-fonts 2.0-9

Для Ubuntu я не помню правильные пакеты, но я думаю, у вас будут самые высокие шансы на успех с ttf-liberation, ttf-ms-conts (msttcorefonts в Ubuntu), xorg-fonts-100dpi, xorg-fonts-alias или их аналогами Debian/Ubuntu.

Поэтому я думаю, что есть два возможных решения: либо попробовать другой шрифт. Раньше у меня работал Arial, сейчас тоже работает Times New Roman. Или установите соответствующие шрифты на свой компьютер.

edit С этой стороны кажется, что рендеринг в MATLAB работает почти идеально. Однако экспорт в PDF не работает. Любые форматы растровых изображений должны работать нормально.

Мое следующее предположение состоит в том, что в случае с PDF действительно виноват MATLAB. Я провел несколько тестов, используя обычное сохранение PDF и печать в файл. Оба демонстрируют одну и ту же проблему. Это неудивительно, поскольку функция сохранения PDF в MATLAB, кажется, генерирует PS, который впоследствии преобразуется в PDF. Предположительно, в поколении PS происходит что-то гнилое и несовместимое с юникодом.

Я знаю, что это не полное решение вашей проблемы, но вы можете, по крайней мере, экспортировать свои рисунки в PNG, если ваше разрешение достаточно высокое, большинство людей не заметят.

Другим решением, если вы используете LaTeX для создания отчета, является использование matlab2tikz для создания ваши цифры, там я смог вставить текст на иврите в код LaTeX. Однако, поскольку у меня нет опыта работы с ивритом в моих файлах TeX, я не знаю, как заставить его компилироваться.

person Egon    schedule 02.03.2012
comment
Английский хорош, но я пишу лабораторный отчет на иврите, поэтому я предпочитаю. Я думал о TeX и «нет» интерпретаторах, поэтому я уже пробовал это раньше. Попытка LaTeX была хорошей идеей, но я не мог вставлять неанглийские символы, не жалуясь на предупреждение: невозможно интерпретировать строку TeX и не отображать. - person Yuval; 02.03.2012
comment
@Yuval: я понимаю, что это личное предпочтение в любом случае. С LaTeX вам может понадобиться как-то закодировать символы иврита, но у меня нет в этом опыта, так как я сам не умею читать/писать на иврите. Альтернативой для вашего отчета может быть экспорт цифр в формат, который поддерживает иврит (просто угадаю: EMF/WMF, PowerPoint, TikZ)? - person Egon; 03.03.2012
comment
Я не думаю, что это проблема шрифта; У меня также установлено большинство этих шрифтов (xfonts-base, xfonts-intl-european, xfonts-100dpi-transcoded, xfonts-efont-unicode, xfonts-mathml, xfonts-75dpi, xfonts-efont-unicode-ib, xfonts-scalable, xfonts-75dpi-transcoded, xfonts-encodings, xfonts-utils). Когда я указываю шрифт TTF, который я установил (FreeSans), он плохо отображается. В противном случае, когда я его указываю, он отображает Times New Roman хорошо, но создает путаницу символов, типичную для приложений, не поддерживающих UTF-8. Я считаю, что это проблема X-сервера. - person Yuval; 08.04.2012
comment
@Yuval, действительно, теперь кажется, что и на моем компьютере. MATLAB отлично визуализирует, но экспортированный PDF-файл показывает те же проблемы, что и ваше изображение. сколько шрифтов показывает ваша команда listfonts в MATLAB (около 10?). С Ubuntu у меня никогда не было проблем, но в Arch я знал, что мне нужно кое-что изменить, чтобы получить там полный список. - person Egon; 08.04.2012
comment
Добавлен вывод listfonts к вопросу. - person Yuval; 08.04.2012
comment
Кажется, это проблема со шрифтом. Запуск x=listfonts; for i=1:numel(x) ; display(x{i}); title('ירוק','Color','red','FontName',x{i},'FontSize',50); pause ; end помогает увидеть, какие шрифты отображаются правильно, а какие нет. Экспорт в PDF/EPS, однако, по-прежнему показывает тарабарщину. PNG экспортирует нормально. - person Yuval; 08.04.2012

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

x=listfonts
for i=1:numel(x) 
    display(x{i})
    title('ירוק','Color','red','FontName',x{i},'FontSize',50)
    pause
end

Для меня сработала Lucida Sans. Однако он будет отображать иврит в обратном порядке.

Вы можете экспортировать в EPS (print -deps - я обнаружил, что это недоступно в Windows; опять же, у вас нет проблемы) и внести некоторые изменения:

  • удалить ужас кодирования из Matlab: просто удалить все вхождения \327
  • добавить раздел /Encoding для сопоставления символов иврита с кодами, выводимыми Matlab

То есть изменить это:

%%IncludeResource: font FreeSans
/FreeSans /ISOLatin1Encoding 200 FMSR

-6384  483 mt 
(\327\220\327\221\327\222\327\223\327\224\327\225\327\226\327\227\327\230\327\231\327\233\327\234\327\236\327\240\327\241\327\242\327\244\327\246\327\250\327\247\327\251\327\252\327\237\327\232\327\245\327\235\327\243) s

к этому:

/Encoding [
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/space /exclam /quotedbl /numbersign 
/dollar /percent /ampersand /quoteright 
/parenleft /parenright /asterisk /plus 
/comma /minus /period /slash 
/zero /one /two /three 
/four /five /six /seven 
/eight /nine /colon /semicolon 
/less /equal /greater /question 
/at /A /B /C 
/D /E /F /G 
/H /I /J /K 
/L /M /N /O 
/P /Q /R /S 
/T /U /V /W 
/X /Y /Z /bracketleft 
/backslash /bracketright /asciicircum /underscore 
/quoteleft /a /b /c 
/d /e /f /g 
/h /i /j /k 
/l /m /n /o 
/p /q /r /s 
/t /u /v /w 
/x /y /z /braceleft 
/bar /braceright /asciitilde /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/.notdef /.notdef /.notdef /.notdef 
/alefhebrew /bethebrew /gimelhebrew /dalethebrew 
/hehebrew /vavhebrew /zayinhebrew /hethebrew 
/tethebrew /yodhebrew /finalkafhebrew /kafhebrew /lamedhebrew 
/finalmemhebrew /memhebrew /finalnunhebrew /nunhebrew /samekhhebrew /ayinhebrew 
/finalpehebrew /pehebrew /finaltsadihebrew /tsadihebrew /qofhebrew /reshhebrew 
/shinhebrew /tavhebrew /.notdef /.notdef 
/.notdef /registered /macron 
/degree /plusminus /twosuperior /threesuperior 
/acute /mu /paragraph /periodcentered 
/cedilla /onesuperior /ordmasculine /guillemotright 
/onequarter /onehalf /threequarters /questiondown 
/Agrave /Aacute /Acircumflex /Atilde 
/Adieresis /Aring /AE /Ccedilla 
/Egrave /Eacute /Ecircumflex /Edieresis 
/Igrave /Iacute /Icircumflex /Idieresis 
/Eth /Ntilde /Ograve /Oacute 
/Ocircumflex /Otilde /Odieresis /multiply 
/Oslash /Ugrave /Uacute /Ucircumflex 
/Udieresis /Yacute /Thorn /germandbls 
/agrave /aacute /acircumflex /atilde 
/adieresis /aring /ae /ccedilla 
/egrave /eacute /ecircumflex /edieresis 
/igrave /iacute /icircumflex /idieresis 
/eth /ntilde /ograve /oacute 
/ocircumflex /otilde /odieresis /divide 
/oslash /ugrave /uacute /ucircumflex 
/udieresis /yacute /thorn /ydieresis 
] def

%%IncludeResource: font FreeSans
/FreeSans /Encoding 200 FMSR
1016  483 mt 
(\220\221\222\223\224\225\226\227\230\231\233\234\236\240\241\242\244\246\250\247\251\252\237\232\245\235\243) s

(Раздел кодирования может быть скопирован как есть, а \327 вхождений были удалены)

Это работает, за исключением того, что по какой-то причине один последний символ отображается неправильно. Мне этого достаточно.

person Yuval    schedule 10.04.2012