MATLAB: comment afficher un texte encodé UTF-8 lu à partir d'un fichier?

voici l'essentiel de ma question:

Comment afficher les caractères Unicode dans L'interface graphique (OS X) de Matlab pour qu'ils soient correctement rendus?

Détails:

j'ai une table de chaînes stockées dans un fichier, et certaines de ces chaînes contiennent des caractères Unicode encodés en UTF-8. J'ai essayé de nombreuses façons (trop nombreuses pour être listées ici) d'afficher le contenu de ce fichier dans L'interface graphique de MATLAB, sans succès. Pour exemple:

>> 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 =

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

comme il arrive, si je colle la chaîne directement dans L'interface graphique de MATLAB, la chaîne collée est affichée correctement, ce qui montre que L'interface graphique n'est pas fondamentalement incapable d'afficher ces caractères, mais une fois que MATLAB la lit, elle l'affiche plus longtemps correctement. Par exemple:

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

pasted =


>> 

Merci!

25
demandé sur Delan Azabani 2011-07-28 21:31:29

1 réponses

je présente ci-dessous mes conclusions après avoir fait quelques recherches... Tenir compte de ces fichiers de test:

a.txt

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

b.txt

தமிழ்

tout d'Abord, nous lire des fichiers:

%# 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');

Si vous essayez d'imprimer à la chaîne, vous obtenez un tas de bêtises:

>> str
str =

néanmoins,str tient la corde correcte. Nous pouvons vérifier le code Unicode de chaque caractère, qui sont comme vous pouvez voir en dehors de la gamme ASCII (les deux derniers sont les fin de ligne CR-LF non imprimable):

>> 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
figure
text(0.1, 0.5, str, 'FontName','Arial Unicode MS')
title(str)
xlabel(str)

un truc que j'ai trouvé est d'utiliser la capacité Java intégrée:

%# 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


alors que je me préparais à écrire ce qui précède, j'ai trouvé une solution alternative. Nous pouvons utiliser le DefaultCharacterSet fonction non documentée et régler le jeu de caractères à UTF-8 (sur ma machine, c'est ISO-8859-1 par défaut):

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

maintenant avec une police correcte (vous pouvez changer la police utilisée dans la fenêtre de commande de Preferences > Font), on peut imprimer la chaîne dans l'invite (notez que DISP est toujours incapable D'imprimer Unicode):

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

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

Et pour l'afficher dans une interface graphique, UICONTROL devrait fonctionner (sous le capot, je pense que c'est vraiment un Java Swing composants):

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

enter image description here

Malheureusement, Texte, Titre, XLABEL, etc.. montrent encore des ordures:

enter image description here


comme note secondaire: il est difficile de travailler avec des sources de fichiers m contenant des caractères Unicode dans L'éditeur MATLAB. J'ai été en utilisant Notepad++, avec des fichiers encodés comme UTF-8 without BOM.

34
répondu Amro 2011-07-29 11:48:01