MATLAB: ¿cómo mostrar el texto con encoding UTF-8 leído desde el archivo?

La esencia de mi pregunta es esta:

¿Cómo puedo mostrar caracteres Unicode en la GUI de Matlab (OS X) para que se procesen correctamente?

Detalles:

Tengo una tabla de cadenas almacenadas en un archivo, y algunas de estas cadenas contienen caracteres Unicode codificados en UTF-8. He intentado de muchas maneras diferentes (demasiadas para enumerarlas aquí) para mostrar el contenido de este archivo en la GUI de MATLAB, sin éxito. Por ejemplo:

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

Como sucede, si pego la cadena directamente en la GUI de MATLAB, la cadena pegada se muestra correctamente, lo que muestra que la GUI no es fundamentalmente incapaz de mostrar estos caracteres, pero una vez que MATLAB la lee, ya no la muestra correctamente. Por ejemplo:

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

¡Gracias!

Presento a continuación mis hallazgos después de hacer algunas excavaciones … Considere estos archivos de prueba:

a.txt

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

b.txt

 தமிழ் 

Primero, leemos archivos:

 %# 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 intentas imprimir la cadena, obtienes un montón de tonterías:

 >> str str = 

No obstante, str contiene la cadena correcta. Podemos verificar el código Unicode de cada carácter, que es lo que puedes ver fuera del rango ASCII (los dos últimos son los finales de línea CR-LF no imprimibles):

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

Desafortunadamente, MATLAB parece incapaz de mostrar esta cadena Unicode en una GUI por sí misma. Por ejemplo, todos estos fallan:

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

Un truco que encontré es usar la capacidad incorporada de Java:

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


Mientras me preparaba para escribir lo anterior, encontré una solución alternativa. Podemos utilizar la característica no documentada DefaultCharacterSet y establecer el juego de caracteres en UTF-8 (en mi máquina, es ISO-8859-1 por defecto):

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

Ahora con una fuente adecuada (puede cambiar la fuente utilizada en la Ventana de comandos de Preferences > Font ), podemos imprimir la cadena en el aviso (tenga en cuenta que DISP aún no puede imprimir Unicode):

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

Y para mostrarlo en una GUI, UICONTROL debería funcionar (bajo el capó, creo que es realmente un componente Java Swing):

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

enter image description here

Desafortunadamente, TEXT, TITLE, XLABEL, etc. siguen mostrando basura:

enter image description here


Como nota al margen: es difícil trabajar con fonts de m-archivos que contienen caracteres Unicode en el editor de MATLAB. Estaba usando Notepad ++ , con archivos codificados como UTF-8 sin BOM .