_wfopen, эквивалентный в соответствии с Mac OS X

Для точного ответа на этот вопрос на тему «Как отправить данные с помощью намерения из Activity to Service», вам нужно переопределить метод onStartCommand(), в котором вы получаете объект намерения:

Когда вы создаете Service, вы должны переопределить метод onStartCommand(), поэтому, если вы внимательно посмотрите на подпись ниже, вы получите объект intent, который передается ему:

  public int onStartCommand(Intent intent, int flags, int startId)

Итак, из активности вы создадите объект-объект для запуска службы, а затем разместите свои данные внутри объекта-объекта, например, вы хотите передать UserID с Activity на Service:

 Intent serviceIntent = new Intent(YourService.class.getName())
 serviceIntent.putExtra("UserID", "123456");
 context.startService(serviceIntent);

Когда служба запускается, метод onStartCommand() будет вызван так в этом методе, вы можете получить значение (UserID) из объекта-объекта, например,

public int onStartCommand (Intent intent, int flags, int startId) {
    String userID = intent.getStringExtra("UserID");
    return START_STICKY;
}

Примечание: выше answer указывает, чтобы получить Intent с getIntent() методом, который неверен в контексте службы

16
задан Vincent Robert 2 October 2008 в 12:42
поделиться

4 ответа

POSIX API в Mac OS X применим со строками UTF-8. Для преобразования строки wchar_t в UTF-8 возможно использовать платформу CoreFoundation из Mac OS X.

Вот класс, который перенесет UTF-8 сгенерированная строка от строки wchar_t.

class Utf8
{
public:
    Utf8(const wchar_t* wsz): m_utf8(NULL)
    {
        // OS X uses 32-bit wchar
        const int bytes = wcslen(wsz) * sizeof(wchar_t);
        // comp_bLittleEndian is in the lib I use in order to detect PowerPC/Intel
        CFStringEncoding encoding = comp_bLittleEndian ? kCFStringEncodingUTF32LE
                                                       : kCFStringEncodingUTF32BE;
        CFStringRef str = CFStringCreateWithBytesNoCopy(NULL, 
                                                       (const UInt8*)wsz, bytes, 
                                                        encoding, false, 
                                                        kCFAllocatorNull
                                                        );

        const int bytesUtf8 = CFStringGetMaximumSizeOfFileSystemRepresentation(str);
        m_utf8 = new char[bytesUtf8];
        CFStringGetFileSystemRepresentation(str, m_utf8, bytesUtf8);
        CFRelease(str);
    }   

    ~Utf8() 
    { 
        if( m_utf8 )
        {
            delete[] m_utf8;
        }
    }

public:
    operator const char*() const { return m_utf8; }

private:
    char* m_utf8;
};

Использование:

const wchar_t wsz = L"Here is some Unicode content: éà€œæ";
const Utf8 utf8 = wsz;
FILE* file = fopen(utf8, "r");

Это будет работать на чтение или запись файлов.

14
ответ дан 30 November 2019 в 22:10
поделиться

Вы просто хотите открыть дескриптор файла с помощью пути, который может содержать символы Unicode, правильно? Просто передайте путь в представление файловой системы к fopen.

  • , Если путь прибыл из запаса платформы Mac OS X (например, панель Open или Углерод или Какао), Вы не должны будете делать никакого преобразования на нем и сможете использовать его как есть.

  • при генерации части пути сами необходимо создать CFStringRef из пути и затем заставить это в представлении файловой системы передавать API POSIX как open или fopen.

Вообще говоря, Вы не должны будете делать большого количества этого для большинства приложений. Например, много приложений могут иметь вспомогательные файлы данных, сохранил каталог Application Support пользователя, но, пока названиями тех файлов является ASCII, и Вы используете стандартные API Mac OS X для определения местоположения каталога Application Support пользователя, Вы не должны делать набора параноидального преобразования пути, созданного с теми двумя компонентами.

Отредактированный для добавления: я сильно предостерег бы против [1 118] произвольно преобразование всего к 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, чтобы не помещать несколько файлов с тем же именем (как пользователь чувствует их) в том же каталоге.

правила для того, как выполнить это каноническое разложение, могут стать довольно волосатыми, так а не попытаться реализовать, оно самостоятельно лучше оставлять это функциям, системные платформы предусмотрели Вас, чтобы сделать тяжелый подъем.

5
ответ дан 30 November 2019 в 22:10
поделиться

При использовании Какао, это довольно легко с NSString. Просто загрузите данные UTF16 в использовании-initWithBytes:length:encoding: (или возможно-initWithCString:encoding:) и затем получают версию UTF8 путем вызова UTF8String на результате. Затем просто назовите fopen со своей новой строкой UTF8 как параметрический усилитель.

можно определенно назвать fopen со строкой UTF-8, независимо от языка - не может помочь с C++ на OSX, хотя - извините.

0
ответ дан 30 November 2019 в 22:10
поделиться

@JKP:

Не все функции в MacOS X принимают UTF8, но имена файлов и filepaths могут быть UTF8, таким образом все функции POSIX, имеющие дело с доступом к файлу (открытый, fopen, статистика, и т.д.), принимают UTF8.

См. здесь . Кавычка:

то, Как имя файла смотрит на уровень API, зависит от API. Текущие Углеродные API обрабатывают имена файлов как массив символов UTF-16; POSIX обрабатывают их как массив UTF-8, который является, почему UTF-8 работает хорошо в Терминале. То, как это хранится на диске, зависит от формата диска; HFS + использует UTF-16, но это не важно в большинстве случаев.

Некоторые другие функции POSIX обрабатывают UTF8 также. Например, функции, имеющие дело с именами пользователей, названиями группы или паролями пользователя, используют UTF8, чтобы хранить информацию (таким образом, имя пользователя может быть японским, и Ваш пароль может быть китайским, без проблем).

, Но не весь дескриптор UTF8. Например, для всех строковых функций строка UTF8 является просто нормальной струной до, и символы выше 126 не имеют никакого особого значения. Они не понимают понятия нескольких байтов (символы в C) формирование единственного символа Unicode. Как другие API обрабатывают символ *, указатель, передаваемый им, отличается от API до API. Однако, как правило, как ползунок можно сказать:

Любой функция только принимает струны до с чистыми символами ASCII (только в диапазоне от 0 до 126), или это примет UTF8. Обычно функции не позволяют символы выше 126 и интерпретируют их в любом другом кодировании, чем UTF8. Если это действительно имело место, это документируется и затем должен быть способ передать кодирование наряду со строкой.

2
ответ дан 30 November 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: