2013-03-31 2 views
2

MATLAB Engine является интерфейсом C к MATLAB. Он предоставляет функцию engEvalString(), которая принимает некоторый код MATLAB как строку C (char *), оценивает его, а затем возвращает результат MATLAB как строку C снова.Получить MATLAB Engine для возврата unicode

Мне нужно иметь возможность передавать данные Юникода в MATLAB через engEvalString() и извлекать выходные данные в виде unicode. Как я могу это сделать? Меня не интересует конкретная кодировка (UTF-8, UTF-16 и т. Д.), Любой будет делать. Я могу адаптировать свою программу.


Подробнее:

Чтобы дать конкретный пример, если я посылаю следующее жало, зашифрованное как, скажем, UTF-8,

s='Paul Erdős' 

Я хотел бы получить обратно Следующий вывод, снова закодированы в UTF-8:

s = 

Paul Erdős 

Я надеялся добиться этого путем отправки feature('DefaultCharacterSet', 'UTF-8') (reference), прежде чем делать что-либо еще, и это отлично работает при работе с MATLAB R2012b на OS X. Он также отлично работает с R2013a на Ubuntu Linux. Однако он не работает на R2013a на OS X. Вместо символа ő в выводе engEvalString() я получаю код символа 26, который должен означать «Я не знаю, как это представить». Однако, если я получаю содержимое переменной sby other means, я вижу, что MATLAB правильно сохраняет символ ő в строке. Это означает, что только выход не работал, но MATLAB правильно интерпретировал вход UTF-8. Если я тестирую это на Windows с R2013a, ни вход, ни вывод не работают правильно. (Обратите внимание, что для Windows и реализации Mac/Linux по MATLAB Engine отличаются.)

Возникает вопрос: как я могу получить Юникода ввода/вывода работает на всех платформах (Win/Mac/Linux) с engEvalString()? Мне нужно это для работы в R2013a, и желательно также в R2012b.


Если люди готовы экспериментировать, я могу предоставить некоторый тестовый код С. Я еще не размещаю это, потому что это большая работа, чтобы перегонять полезный небольшой пример из моего кода, который позволяет экспериментировать с разными кодировками.


UPDATE:

я узнал о художественном ('локали'), который возвращает некоторые региональные данные, связанные с. В Linux, где все работает правильно, все кодировки, которые он возвращает, - UTF-8. Но не на OS X/Windows. Есть ли способ установить различные кодировки, возвращаемые функцией ('locale')?


UPDATE 2:

Вот небольшой тест: download. Почтовый файл содержит программу MATLAB Engine C, которая считывает файл, передает его на engEvalString(), а затем записывает вывод в другой файл.Там в пример файла включен со следующим содержанием:

feature('DefaultCharacterSet', 'UTF-8') 
feature('DefaultCharacterSet') 
s='中' 

The (последняя часть) продукции я ожидаю

>> 
s = 

中 

Это то, что я получаю с R2012b на OS X. Однако, R2013 на OS X дает мне код символа 26 вместо символа . Выходы, создаваемые R2012b и R2013a, включены в zip-файл.

Как получить ожидаемый результат с R2013a на всех трех платформах (Windows, OS X, Linux)?

+0

[Перекресток размещен на MATLAB Answers] (http://www.mathworks.com/matlabcentral/answers/69316-get-matlab-engine-engevalstring-to-take-return-unicode) – Szabolcs

ответ

1

Я настоятельно рекомендую использовать вместо этого engPutVariable, engGetVariable и Matlab's eval. То, что вы пытаетесь сделать с engEvalString, не будет работать со многими строками unicode из-за встроенных символов NULL (\ 0), среди других проблем. Из-за того, как работает COM-интерфейс Windows, механизм Matlab не может действительно поддерживать unicode в интерпретируемых строках. Я не могу размышлять о том, как работает двигатель на других платформах.

Your other question получил ответ об использовании mxCreateString_UTF16. Разве этого недостаточно?

+0

Итак, на Windows нет никаких шансов это будет работать с 'engEvalString()'? Да, комбинация 'engPutVariable()', 'engGetVariable()' и 'eval' должна работать (я могу обрабатывать unicode с этими). Я просто не использовал его раньше, потому что на OS X у меня не было проблем с отправкой/получением UTF-8 в/из engEvalString --- до выхода R2013a. – Szabolcs

+0

Что-то связанное: что относительно unicode .m исходных файлов? Знаете ли вы, может ли MATLAB справиться с ними, или я даже не должен пытаться? – Szabolcs

+1

К сожалению, кажется, что использование 'evalc()' отключает компиляцию JIT и приводит к значительному снижению производительности. Из-за этого это не очень хорошее решение. – Szabolcs

Смежные вопросы