Matlab в Linux (Ubuntu 11.10) не отображает Unicode (иврит) на графике - PullRequest
9 голосов
/ 02 марта 2012

Я пытаюсь использовать ивритские символы в графике 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, слишком сложен для использования с количеством графиков, которые у меня есть.

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


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

Screenshot of figure screen showing rubbish


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

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


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

Другое редактирование 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'

Ответы [ 2 ]

4 голосов
/ 02 марта 2012

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

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

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

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

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

Proof of Hebrew

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

enter image description here

На 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. Или установите правильные шрифты на свой компьютер.

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

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

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

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

3 голосов
/ 10 апреля 2012

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

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

Для меня Люцида Санс работала. Однако он будет отображать иврит в обратном порядке.

Вы можете экспортировать в 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 удалены)

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

...