La esencia de mi pregunta es esta:

¿Cómo puedo mostrar caracteres Unicode en Matlab GUI (OS X) de modo que estén debidamente prestados?

Detalles:

Tengo una tabla de cadenas de caracteres almacenados en un archivo, y algunas de estas cadenas contienen codificados en UTF-8 caracteres Unicode. He tratado de muchas maneras diferentes (demasiados a la lista aquí) para mostrar el contenido de este archivo en MATLAB GUI, 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 se me pegue la cadena directamente en el MATLAB GUI, la pega cadena se muestra correctamente, lo que muestra que la interfaz de usuario no es fundamentalmente incapaz de mostrar a estos personajes, pero una vez que MATLAB lo lea, que no muestra correctamente. Por ejemplo:

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

pasted =


>> 

Gracias!

InformationsquelleAutor kjo | 2011-07-28

1 Comentario

  1. 34

    Presento a continuación mis conclusiones después de hacer algo de investigación… Considerar 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 intenta imprimir la cadena, tienes un montón de tonterías:

    >> str
    str =

    Sin embargo, str mantiene la cadena correcta. Podemos comprobar el código Unicode de cada personaje, que son como usted puede ver fuera del rango ASCII (las últimas dos son los no imprimibles CR-LF finales de línea):

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

    Por desgracia, MATLAB parece incapaz de mostrar esta cadena Unicode en una interfaz gráfica de usuario en su cuenta. Por ejemplo, todos estos errores:

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

    Uno de los trucos que he encontrado es usar el embedded Java capacidad:

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

    MATLAB: cómo mostrar codificados en UTF-8 texto de lectura del archivo?


    Mientras me preparaba para escribir el anterior, he encontrado una solución alternativa. Podemos utilizar el DefaultCharacterSet indocumentados función y establecer el conjunto de caracteres a UTF-8 (en mi máquina, es ISO-8859-1 por defecto):

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

    Ahora con una fuente adecuada (usted puede cambiar la fuente utilizada en la Ventana de Comandos de Preferences > Font), podemos imprimir la cadena en el símbolo del sistema (tenga en cuenta que DISP aún es incapaz de impresión Unicode):

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

    Y mostrar en una interfaz gráfica de usuario, UICONTROL debería funcionar (bajo el capó, creo que es realmente un Java Swing componente):

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

    MATLAB: cómo mostrar codificados en UTF-8 texto de lectura del archivo?

    Por desgracia, TEXTO, TÍTULO, XLABEL, etc.. siguen mostrando la basura:

    MATLAB: cómo mostrar codificados en UTF-8 texto de lectura del archivo?


    Como una nota al margen: es difícil trabajar con el m-archivo de fuentes que contiene caracteres Unicode en el editor de MATLAB. Yo estaba usando Notepad++, con archivos codificados como UTF-8 sin BOM.

    • ++Gracias! (MATLAB es realmente decepcionante aquí…)
    • ¿Qué acerca de codificado cadenas en el editor. Es allí una manera de hacer MATLAB editor de usar UTF-8?
    • MATLAB puede ejecutar archivos con codificados con Unicode cadenas de jus fina (str='...'), siempre y cuando no se editar en el Editor de MATLAB (al menos ese es el caso en mi WinXP máquina). Podría ser un problema de configuración (configuración de idioma y configuración regional?), pero no pude hacer que funcione con el MATLAB IDE… La solución fue utilizar un editor externo para escribir el código. En mi caso fue el Notepad++, tuve que especificar la codificación como UTF-8 sin BOM en caso contrario MATLAB se queja acerca de la sintaxis de error con un carácter adicional al principio del archivo.
    • olvidaba decir que usted debe asegúrese de llamar feature('DefaultCharacterSet','UTF-8'); antes de que
    • Me imaginé que fuera, estaba haciendo uso de MATLAB editor como es UTF8 texto. Me gusta la función de autocompletar y otras características del editor.
    • lo siento, pero no he encontrado una forma de hacer el trabajo con el grupo builtin editor
    • Maravilloso valoración crítica. Afortunadamente, la situación ha mejorado dramáticamente en R2013a! Visualización de unicode en la ventana de comandos funciona por defecto, y una vez que el UTF-8 conjunto de caracteres característica ha sido seleccionado también funciona dentro de manejar objetos gráficos. Por desgracia unicode dentro de los literales de cadena es aún incompatible. Véase también el fallo 312955 en Mathworks: mathworks.com/support/bugreports/312955
    • gracias por la actualización. De hecho, la ventana de comandos se muestra el texto a la derecha (suponiendo capaz de fuente se utiliza). Sin embargo, manejar gráficos todavía no mostrar correctamente el texto (text, xlabel, ylabel funciones), incluso después de ajustar DefaultCharacterSet característica. Acabo de probar esto en WinXP 32 bits utilizando R2013a, tal vez la situación es diferente en otras plataformas. Es bueno saber que TMW está buscando en este tema 🙂
    • Ah, muy interesante. Entonces es dependiente de la plataforma comportamiento. Yo había probado que trabaja en Mac.
    • Actualización: estoy feliz de informar que MATLAB R2014b (preliminar hasta el momento) parece que se ha solucionado la mayoría de las cuestiones anteriormente mencionadas. El símbolo del sistema, Manejar gráficos (el nuevo HG2), uicontrols, y directa de Java componentes Swing, hacen de texto Unicode correctamente, sin tener que cambiar de DefaultCharacterSet (he probado en una maquina con Windows configurado con el valor de configuración regional en-US). Por desgracia, el editor/IDE todavía no se ahogue no codificada en ASCII archivos de origen (cosas como BOM marcadores no se reconoce correctamente)

Dejar respuesta

Please enter your comment!
Please enter your name here