Получить MATLAB Engine для возврата юникода

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

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


Больше деталей:

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

s='Paul Erdős'

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

s =

Paul Erdős

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

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


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


ОБНОВИТЬ:

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


ОБНОВЛЕНИЕ 2:

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

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

(Последняя часть) вывод, который я ожидаю

>> 
s =

中

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

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

1 ответ

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

Ваш другой вопрос имел ответ об использовании mxCreateString_UTF16, Разве этого не достаточно?

Другие вопросы по тегам