我的问题的主旨是:
如何在Matlab的GUI(OS X)中显示Unicode字符,以便正确呈现它们?
详细说明:
我有一个存储在文件中的字符串表,其中一些字符串包含UTF-8编码的Unicode字符。我已尝试了许多不同的方法(这里列出太多)以在MATLAB GUI中显示该文件的内容,但没有成功。例如:
>> 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 =
ÎÎÎÎÎΠΣΦΩαβγδεζηθικλμνξÏÏÏÏÏÏÏÏÏÏ
>>
碰巧,如果我将字符串直接粘贴到MATLAB GUI中,粘贴的字符串会正确显示,这表明GUI根本不能显示这些字符,但是一旦MATLAB读入它,它就会更长时间地显示它正确。例如:
>> pasted = 'ΓΔΘΛΞΠΣΦΩαβγδεζηθικλμνξπρςστυφχψω'
pasted =
>>
谢谢!
答案 0 :(得分:34)
在进行一些挖掘后,我在下面的研究结果中提出...考虑这些测试文件:
ΓΔΘΛΞΠΣΦΩαβγδεζηθικλμνξπρςστυφχψω
தமிழ்
首先,我们阅读文件:
%# 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');
如果你试图打印字符串,你会得到一堆废话:
>> str
str =
尽管如此,str
确实拥有正确的字符串。我们可以检查每个字符的Unicode代码,您可以在ASCII范围之外看到(最后两个是不可打印的CR-LF行结尾):
>> 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
不幸的是,MATLAB似乎无法在GUI中单独显示此Unicode字符串。例如,所有这些都失败了:
figure
text(0.1, 0.5, str, 'FontName','Arial Unicode MS')
title(str)
xlabel(str)
我发现的一个技巧是使用嵌入式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);
在我准备写上述内容时,我找到了另一种解决方案。我们可以使用DefaultCharacterSet
未记录的功能并将字符集设置为UTF-8
(在我的计算机上,默认情况下为ISO-8859-1
):
feature('DefaultCharacterSet','UTF-8');
现在使用正确的字体(您可以从Preferences > Font
更改命令窗口中使用的字体),我们可以在提示符中打印字符串(请注意,DISP仍然无法打印Unicode):
>> str
str =
ΓΔΘΛΞΠΣΦΩαβγδεζηθικλμνξπρςστυφχψω
>> disp(str)
ΓΔΘΛΞΠΣΦΩαβγδεζηθικλμνξπÏςστυφχψω
要在GUI中显示它,UICONTROL应该可以工作(我认为它实际上是一个Java Swing组件):
uicontrol('Style','text', 'String',str, ...
'Units','normalized', 'Position',[0 0 1 1], ...
'FontName','Arial Unicode MS', 'FontSize',30)
不幸的是,TEXT,TITLE,XLABEL等仍然显示垃圾:
作为旁注:在MATLAB编辑器中使用包含Unicode字符的m文件源很困难。我使用Notepad++,文件编码为 UTF-8,没有BOM 。