Получить 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
, Разве этого не достаточно?