Для экспорта рисунка Matlab с не-ASCII символами ISO-8859-1 проблем в Windows нет, но в Linux с языком UTF-8 есть ошибка Matlab и обходной путь . Вопрос здесь нацелен на символы, которых нет в ISO-8859-1, что более сложно. Вот решение, которое я разместил на связанном вопросе .
Если необходимое количество символов меньше 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 - это eps, созданный Matlab, создает file_latin2.eps с кодировкой Latin-2. Файл ISOLatin2Encoding.ps содержит вектор кодировки :
/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
, создайте файл file_latin2.eps с кодировкой Latin-2.
Его можно легко адаптировать к другим 8-битным стандартам кодирования, изменив вектор кодировки и параметр iconv (или codecs.open) в скрипте.