macos - MATLAB:如何显示从文件中读取的 UTF-8 编码文本?

标签 macos user-interface matlab unicode utf-8

我的问题的要点是:

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

enter image description here


当我准备写上面的内容时,我找到了一个替代解决方案。我们可以使用 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)

enter image description here

不幸的是,TEXT、TITLE、XLABEL 等仍然显示垃圾:

enter image description here


附带说明:很难在 MATLAB 编辑器中处理包含 Unicode 字符的 m 文件源。我用的是 Notepad++ ,文件编码为 UTF-8 无 BOM

关于macos - MATLAB:如何显示从文件中读取的 UTF-8 编码文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6863147/

相关文章:

ios - 有没有办法将自定义 SQL 添加(破解)到核心数据提取中?

c# - 如何将值从 C++ 主应用程序返回到 C# GUI 应用程序?

matlab - 将两个参数传递给 fminunc 函数

objective-c - 如何从组合 TIFF 中获取合适的 CGImage 用于显示比例

macos - ~/.profile、~/.bashrc 和 ~/.bash_profile 未在新终端启动时运行

java - 线程在中断或停止后不会停止

matlab - 为什么 Matlab fft2 比 OpenCV dft 快得多

matlab - 在字面书写的矩阵中,带省略号的行尾与不带省略号的行尾有什么区别?

编译 OpenGL 和 GLUT OSX

html - 如果列数超过 3,则在 Angular js 中使用 ng-repeat 动态添加一行