對於用非ASCII ISO-8859-1字符導出Matlab圖形,在Windows上沒有問題,但在具有UTF-8語言環境的Linux上有Matlab錯誤和workaround。這裏的問題針對的是不在ISO-8859-1中的字符,這更加棘手。以下是我發佈在相關question上的解決方案。
如果需要的字符數小於256(8位格式),理想地在標準的編碼集,那麼一種解決方案是:
- 轉換八進制代碼到Unicode字符;
- 將文件保存到目標編碼標準(以8位格式);
- 添加目標編碼集的編碼矢量。
例如,如果要導出波蘭語文本,則需要將該文件轉換爲ISO-8859-2。以下是Python(多平臺)的實現:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys,codecs
input = sys.argv[1]
fo = codecs.open(input[:-4]+'_latin2.eps','w','latin2')
with codecs.open(input,'r','string_escape') as fi:
data = fi.readlines()
with open('ISOLatin2Encoding.ps') as fenc:
for line in data:
fo.write(line.decode('utf-8').replace('ISOLatin1Encoding','MyEncoding'))
if line.startswith('%%EndPageSetup'):
fo.write(fenc.read())
fo.close()
另存爲eps_lat2.py;然後運行命令python eps_lat2.py file.eps
,其中file.eps是由Matlab創建的eps,使用Latin-2編碼創建file_latin2.eps。該文件ISOLatin2Encoding.ps包含encoding vector:
/MyEncoding
% The first 144 entries are the same as the ISO Latin-1 encoding.
ISOLatin1Encoding 0 144 getinterval aload pop
% \22x
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
% \24x
/nbspace /Aogonek /breve /Lslash /currency /Lcaron /Sacute /section
/dieresis /Scaron /Scedilla /Tcaron /Zacute /hyphen /Zcaron /Zdotaccent
/degree /aogonek /ogonek /lslash /acute /lcaron /sacute /caron
/cedilla /scaron /scedilla /tcaron /zacute /hungarumlaut /zcaron /zdotaccent
% \30x
/Racute /Aacute /Acircumflex /Abreve /Adieresis /Lacute /Cacute /Ccedilla
/Ccaron /Eacute /Eogonek /Edieresis /Ecaron /Iacute /Icircumflex /Dcaron
/Dcroat /Nacute /Ncaron /Oacute /Ocircumflex /Ohungarumlaut /Odieresis /multiply
/Rcaron /Uring /Uacute /Uhungarumlaut /Udieresis /Yacute /Tcedilla /germandbls
% \34x
/racute /aacute /acircumflex /abreve /adieresis /lacute /cacute /ccedilla
/ccaron /eacute /eogonek /edieresis /ecaron /iacute /icircumflex /dcaron
/dcroat /nacute /ncaron /oacute /ocircumflex /ohungarumlaut /odieresis /divide
/rcaron /uring /uacute /uhungarumlaut /udieresis /yacute /tcedilla /dotaccent
256 packedarray def
這裏是在Linux上另一種實現方式使用bash:
#!/bin/bash
name=$(basename "$1" .eps)
ascii2uni -a K "$1" > /tmp/eps_uni.eps
iconv -t ISO-8859-2 /tmp/eps_uni.eps -o "$name"_latin2.eps
sed -i -e '/%EndPageSetup/ r ISOLatin2Encoding.ps' -e 's/ISOLatin1Encoding/MyEncoding/' "$name"_latin2.eps
保存爲eps_lat2;然後運行命令sh eps_lat2 file.eps
創建帶有Latin-2編碼的file_latin2.eps。
通過更改腳本中的編碼矢量和iconv(或codecs.open)參數,可以輕鬆地將其適用於其他8位編碼標準。
我以某種方式忽略了使用pdflatex的信息。對於不那麼醜陋的解決方法你有什麼想法嗎? – triazotan 2011-02-10 16:06:14
Matlab可以直接在文本字段中解釋乳膠。您是否曾嘗試在matlab文本字段中放置像「\'c」這樣的膠乳構造,並將解釋器設置爲「latex」而不是直接輸入「ć」? – groovingandi 2011-02-10 18:05:49