macos - reina - MATLAB: ¿cómo mostrar el texto con codificación UTF-8 leído desde el archivo?
la biblia hablada (1)
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);
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)
Desafortunadamente, TEXT, TITLE, XLABEL, etc. siguen mostrando basura:
Como nota al margen: es difícil trabajar con fuentes de m-archivos que contienen caracteres Unicode en el editor de MATLAB. Estaba usando Notepad++ , con archivos codificados como UTF-8 sin BOM .
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!