私の質問の要点はこれです:
MatlabのGUI(OS X)でUnicode文字を表示して、正しくレンダリングするにはどうすればよいですか?
詳細:
ファイルに格納されている文字列のテーブルがあり、これらの文字列の一部にはUTF-8でエンコードされたUnicode文字が含まれています。このファイルの内容をMATLABGUIに表示するために、さまざまな方法(ここにリストするには多すぎます)を試しましたが、成功しませんでした。例えば:
>> 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 =
>>
ありがとう!
いくつか掘り下げた後の調査結果を以下に示します...次のテストファイルを検討してください。
ΓΔΘΛΞΠΣΦΩαβγδεζηθικλμνξπρςστυφχψω
தமிழ்
まず、ファイルを読み取ります。
%# 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の範囲外で確認できます(最後の2つは印刷できない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はこのUnicode文字列をGUIで単独で表示できないようです。たとえば、これらはすべて失敗します。
figure
text(0.1, 0.5, str, 'FontName','Arial Unicode MS')
title(str)
xlabel(str)
私が見つけた1つのトリックは、埋め込まれた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なし)。