Как преобразовать струну до (массив символов) в строку Python, когда существуют символы неASCII в строке?

Я предполагаю, что, когда вы загружаете файл из Интернета, вы уверены, что загружаете видео при таких обстоятельствах? И что вам действительно нужно, так это просто изменить формат, то есть PathExtension, например .mp4, .png, jpeg и т. Д.

Если (если и только если) это так, то вы можете добавить расширение файла к компоненту пути.

let destinationURL = docDirectoryURL.appendingPathComponent("\(destinationFilename!)").appendingPathExtension("mp4")

Теперь, когда вы проверяете свои сохраненные файлы, он будет содержать «.mp4»

Опять же, я предполагаю, что вы на 110% уверены, что скачиваете «.mp4». "из паутины.

7
задан Robert Harvey 31 July 2014 в 19:58
поделиться

3 ответа

PyString_Decode делает это:

PyObject *PyString_Decode(const char *s,
              Py_ssize_t size,
              const char *encoding,
              const char *errors)
{
    PyObject *v, *str;

    str = PyString_FromStringAndSize(s, size);
    if (str == NULL)
    return NULL;
    v = PyString_AsDecodedString(str, encoding, errors);
    Py_DECREF(str);
    return v;
}

IOW, это делает в основном, что Вы делаете в своем втором примере - преобразовывает в строку, затем декодируйте строку. Проблема здесь является результатом PyString_AsDecodedString, а не PyString_AsDecodedObject. PyString_AsDecodedString делает PyString_AsDecodedObject, но затем пытается преобразовать получающийся объект unicode в строковый объект с кодировкой по умолчанию (для Вас, похож это - ASCII). Это - то, где это перестало работать.

Я полагаю, что необходимо будет сделать два вызова - но можно использовать PyString_AsDecodedObject вместо того, чтобы звонить, Python "декодируют" метод. Что-то как:

#include <Python.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
     char c_string[] = { (char)0x93, 0 };
     PyObject *py_string, *py_unicode;

     Py_Initialize();

     py_string = PyString_FromStringAndSize(c_string, 1);
     if (!py_string) {
          PyErr_Print();
          return 1;
     }
     py_unicode = PyString_AsDecodedObject(py_string, "windows_1252", "replace");
     Py_DECREF(py_string);

     return 0;
}

Я не совсем уверен, каково обоснование позади прокладывающего себе путь PyString_Decode. Очень старый поток на python-dev, кажется, указывает, что имеет некоторое отношение к объединению в цепочку вывода, но так как методы Python не делают того же, я не уверен, релевантно ли это все еще.

6
ответ дан 6 December 2019 в 23:15
поделиться

Вы не хотите декодировать строку в представление Unicode, Вы просто хотите рассматривать ее как массив байтов, правильно?

Просто используйте PyString_FromString:

char *cstring;
PyObject *pystring = PyString_FromString(cstring);

Это все. Теперь у Вас есть Python str() объект. См. документы здесь: https://docs.python.org/2/c-api/string.html

Я немного смущен тем, как указать "ул." или "unicode". Они очень отличаются, если у Вас есть символы неASCII. Если Вы хотите декодировать струну до, и Вы знаете точно, какой набор символов это находится в, то да, PyString_DecodeString хорошее место состоит в том, чтобы запуститься.

3
ответ дан 6 December 2019 в 23:15
поделиться

Попытайтесь звонить PyErr_Print() в"if (!py_string)"пункт. Возможно, исключение Python даст Вам еще некоторую информацию.

2
ответ дан 6 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

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