Учитывая следующий код, который пытается создать 2 папки в текущем пути MATLAB:Unicode пути с MATLAB
%%
u_path1 = native2unicode([107, 97, 116, 111, 95, 111, 117, 116, 111, 117], 'UTF-8'); % 'kato_outou'
u_path2 = native2unicode([233 129 142, 230 184 161, 229 191 156, 231 173 148], 'UTF-8'); % '過渡応答'
mkdir(u_path1);
mkdir(u_path2);
первый mkdir
вызов успешен, а второй выходит из строя, с сообщением об ошибке «имя файла, каталог имя или синтаксис метки тома ". Однако создание папок вручную на панели «Текущая папка» ([щелкните правой кнопкой мыши] ⇒ Новая папка ⇒ [имя пасты]) не вызывает проблем. Такие сбои появляются в большинстве функций ввода/вывода низкого уровня MATLAB (dir
, fopen
, copyfile
, movefile
и т. Д.), И я хотел бы использовать все эти функции.
Среда:
- Win7 Enterprise (32 бит, NTFS)
- MATLAB R2012a
таким образом, файловая система поддерживает символы Unicode в пути, и MATLAB может хранить истинные строки Unicode (а не «подделывать» их).
mkdir
official documentation элегантно {1} избегает этой проблемы, заявив, что правильный синтаксис для вызова функции является:
mkdir('folderName')
, который предполагает, что только официально поддержали призыв к функции является тот, который использует строку литералы для аргумента имени папки, а не строки переменных. Это также предложит eval
способ —, который я тестирую, чтобы посмотреть, работает ли он, когда я пишу этот пост.
Интересно, есть ли способ обойти эти ограничения. Меня бы интересовали решения, которые:
не полагаются на недокументированные/неподдерживаемые материалы MATLAB;
не связаны с общесистемными изменениями (например, с изменением информации об операционной системе);
может в конечном итоге полагаться на не-родные библиотеки MATLAB, так как полученные обработчики/объекты могут быть преобразованы в собственные объекты MATLAB и управляться как таковые;
может в конечном итоге полагаться на манипуляции с путями, которые могли бы сделать их пригодными для использования стандартными функциями MATLAB, даже если Windows специфична (например, пути с короткими именами).
Позже редактировать
Что я ищу в реализации для следующих функций, которые будут ТЕНЬ оригиналы в коде, который уже написано:
function listing = dir(folder);
function [status,message,messageid] = mkdir(folder1,folder2);
function [status,message,messageid] = movefile(source,destination,flag);
function [status,message,messageid] = copyfile(source,destination,flag);
function [fileID, message] = fopen(filename, permission, machineformat, encoding);
function status = fclose(fileID);
function [A, count] = fread(fileID, sizeA, precision, skip, machineformat);
function count = fwrite(fileID, A, precision, skip, machineformat);
function status = feof(fileID);
function status = fseek(fileID, offset, origin);
function [C,position] = textscan(fileID, varargin); %'This one is going to be funny'
Не все типы вывода должны быть взаимозаменяемы с оригинальными функциями MATLAB, однако должны быть согласованы между вызовами функций (например, fileID
между fopen
и fclose
). Я собираюсь обновить этот список объявлений с помощью реализаций, как только я их получу/напишу.
{1} для очень рыхлых значений слова "элегантный".
Я ничего не знаю о Matlab, но эти функции, скорее всего, тонкие оберток над функциями ввода/вывода стандартной библиотеки C файла. Эти интерфейсы явно принимают имена файлов в виде строк байтов, которые Windows преобразует в собственный формат UTF-16 с использованием кодовой страницы ANSI. Для приложения, использующего функции stdio, нет способа получить доступ к файлам, чьи имена содержат символы вне этой кодировки (а кодовая страница ANSI никогда не будет полезной, как UTF). – bobince
@bobince То, как эти функции ведут себя, я подозреваю, что тоже. Тем не менее, я надеялся, что они обернут скорее системные вызовы (которые полностью поддерживают функции базовой файловой системы), чем стандартные функции библиотеки, которые ограничены их исторической аргументацией/типом. –