我的问题的要点是:
How can I display Unicode characters in Matlab's GUI (OS X) so that they are properly rendered?
详细信息:
我有一个存储在文件中的字符串表,其中一些字符串包含 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 =
>>
谢谢!
最佳答案
我在做了一些挖掘之后在下面展示了我的发现......考虑这些测试文件:
a.txt
ΓΔΘΛΞΠΣΦΩαβγδεζηθικλμνξπρςστυφχψω
b.txt
தமிழ்
首先,我们读取文件:
%# 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。
关于macos - MATLAB:如何显示从文件中读取的 UTF-8 编码文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6863147/