Вы просто хотите открыть дескриптор файла, используя путь, который может содержать символы Unicode, верно? Просто передайте путь в представлении файловой системы в fopen
.
Если путь взят из стандартных платформ Mac OS X (например, панели Open, Carbon или Cocoa), вам не нужно будет выполнять какие-либо преобразования для нее, и вы сможете использовать ее как есть.
Если вы сами генерируете часть пути, вы должны создать CFStringRef из вашего пути и затем получить его в представлении файловой системы для передачи в API POSIX, такие как open
или fopen
.
Вообще говоря, вам не придется делать много этого для большинства приложений. Например, во многих приложениях файлы вспомогательных данных могут храниться в каталоге поддержки приложений пользователя, но если имена этих файлов являются ASCII, и вы используете стандартные API Mac OS X для поиска каталога поддержки приложений пользователя, вам не нужно сделать параноидальное преобразование пути, построенного с этими двумя компонентами.
Отредактировано, чтобы добавить: Я настоятельно рекомендую против произвольно преобразовывать все в UTF-8, используя что-то вроде wcstombs
, потому что кодировка файловой системы не обязательно идентична сгенерированному UTF-8 , Mac OS X и Windows используют определенные (но разные) канонические правила декомпозиции для кодировки, используемой в путях файловой системы.
Например, им нужно решить, будет ли «é» сохраняться в виде одной или двух кодовых единиц (либо LATIN SMALL LETTER E WITH ACUTE
, либо LATIN SMALL LETTER E
, за которыми следует COMBINING ACUTE ACCENT
). Это приведет к двум разным (и разной длине) байтовым последовательностям, и Mac OS X и Windows будут работать над тем, чтобы не помещать несколько файлов с одним и тем же именем (как их воспринимает пользователь) в один и тот же каталог.
Правила того, как выполнять эту каноническую декомпозицию, могут быть довольно сложными, поэтому вместо того, чтобы пытаться реализовать их самостоятельно, лучше оставить для функций, которые системные платформы предоставили вам для выполнения тяжелой работы.