MATLAB: come visualizzare il testo con codifica UTF-8 letto dal file?

L’essenza della mia domanda è questa:

Come posso visualizzare i caratteri Unicode nella GUI di Matlab (OS X) in modo da renderli correttamente visualizzati?

Dettagli:

Ho una tabella di stringhe memorizzate in un file e alcune di queste stringhe contengono caratteri Unicode con codifica UTF-8. Ho provato molti modi diversi (troppi per elencare qui) per visualizzare il contenuto di questo file nella GUI di MATLAB, senza successo. Per esempio:

>> 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 = ÎÎÎÎÎΠΣΦΩαβγδεζηθικλμνξÏÏÏÏÏÏÏÏÏÏ >> 

Come succede, se incollo la stringa direttamente nella GUI di MATLAB, la stringa incollata viene visualizzata correttamente, il che dimostra che la GUI non è fondamentalmente incapace di visualizzare questi caratteri, ma una volta che MATLAB lo legge, lo visualizza più a lungo correttamente. Per esempio:

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

Grazie!

Presento di seguito le mie scoperte dopo aver fatto alcuni scavi … Considera questi file di test:

a.txt

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

b.txt

 தமிழ் 

Per prima cosa, leggiamo i file:

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

Se provi a stampare la stringa, ottieni un sacco di sciocchezze:

 >> str str = 

Ciò nonostante, str mantiene la stringa corretta. Possiamo controllare il codice Unicode di ogni carattere, che è come puoi vedere al di fuori del range ASCII (le ultime due sono le terminazioni di linea CR-LF non stampabili):

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

Sfortunatamente, MATLAB sembra incapace di visualizzare questa stringa Unicode in una GUI a sé stante. Ad esempio, tutti questi errori:

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

Un trucco che ho trovato è usare la funzionalità Java integrata:

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

inserisci la descrizione dell'immagine qui


Mentre mi stavo preparando a scrivere quanto sopra, ho trovato una soluzione alternativa. Possiamo utilizzare la funzione non documentata DefaultCharacterSet e impostare il set di caratteri su UTF-8 (sulla mia macchina, per impostazione predefinita è ISO-8859-1 ):

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

Ora con un font appropriato (puoi cambiare il font usato nella finestra di comando da Preferences > Font ), possiamo stampare la stringa nel prompt (nota che DISP non è ancora in grado di stampare Unicode):

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

E per visualizzarlo in una GUI, UICONTROL dovrebbe funzionare (sotto il cofano, penso che sia davvero un componente Java Swing):

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

inserisci la descrizione dell'immagine qui

Purtroppo, TEXT, TITLE, XLABEL, ecc. Stanno ancora mostrando spazzatura:

inserisci la descrizione dell'immagine qui


Come nota a margine: è difficile lavorare con sorgenti m-file contenenti caratteri Unicode nell’editor MATLAB. Stavo usando Notepad ++ , con file codificati come UTF-8 senza BOM .