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!
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);
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)
Malheureusement, Texte, Titre, XLABEL, etc.. montrent encore des ordures:
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.