web-dev-qa-db-ja.com

MATLAB:ファイルから読み取ったUTF-8でエンコードされたテキストを表示する方法は?

私の質問の要点はこれです:

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 =


>> 

ありがとう!

25
kjo

いくつか掘り下げた後の調査結果を以下に示します...次のテストファイルを検討してください。

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の範囲外で確認できます(最後の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);

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なし)。

34
Amro