Как преобразовать элементы NSArray в utf16 (char16_t)? - PullRequest
0 голосов
/ 02 августа 2020

У меня есть функция, которая получает все содержимое каталога, будь то файлы или каталоги, и я использую contentsOfDirectoryAtPath для сбора содержимого каталога, затем я сохраняю имена файлов / каталогов в контейнере с именем contentsStore, который принимает ключ и значение элементы строки UTF-16 char16_t. посмотрите на следующий код, чтобы прояснить свое видение:

NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:_dirPath error:nil];
for(unsigned int i= 0; i< [dirContents count]; i++){
    if(isDir){
        // `contentsStore` is key&value container that accepts utf-16 string (char16_t)
        contentsStore.Add([[dirContents objectAtIndex:i] UTF8String], "directory");
    } else {
        contentsStore.Add([[dirContents objectAtIndex:i] UTF8String], "file");
    }
}

Обратите внимание, что я не публикую весь код, потому что он большой, но я просто добавил важные части, связанные с проблемой. Кроме того, я использую Objective- C просто как мост для достижения моей цели - использовать Cocoa в macOS, но основным языком, который я использую, является C ++, поэтому весь код представляет собой комбинацию C ++ / Objective- C.

Как заставить метод objectAtIndex выводить содержимое элемента как UTF-16 char16_t?

1 Ответ

0 голосов
/ 02 августа 2020

следующее даст вам представление. [Filemanager defaultmanager] на самом деле поддерживает вашу задачу. Вы можете преобразовать путь в C -строку и затем преобразовать в строку char16_t aka basic_string<char16_t>.

NSString *_dirPath = [[NSBundle mainBundle] bundlePath];
NSError *error = nil;
NSFileManager *manager = [[NSFileManager defaultManager] init];
NSArray *dirContents = [manager contentsOfDirectoryAtPath:_dirPath error:&error];

if (!error && dirContents.count ) {

    for(unsigned int i = 0; i < [dirContents count]; i++){
        NSString *path = [dirContents objectAtIndex:i];
        BOOL isDir;
        std::string usingkey = "file";

        if ([manager fileExistsAtPath:path isDirectory:&isDir] && isDir) {
            usingkey = "directory";
        }
        
        const char *fileRepresentation = [manager fileSystemRepresentationWithPath:path];

        // function declared below..
        std::u16string char16string = to_utf16(fileRepresentation);

        // and use it to store your C++ storageObject, value&key pair
        // don't know of what datatype is usingkey in your source 
        // just assumed std::string 
        contentsStore.Add(char16string, usingkey);

    }
}

, вам нужно будет включить следующее в вашу .mm реализацию

#include <string>
#include <codecvt>
#include <iostream>

@implementation Yourclassname 

//std::u16string is same as basic_string<char16_t>
std::u16string to_utf16( std::string str )
{ return std::wstring_convert< std::codecvt_utf8_utf16<char16_t>, char16_t >{}.from_bytes(str); }

@end
...