Кодировка по умолчанию сообщений об исключениях

Для меня моим Mac OS является Мохаве. и я сталкиваюсь с той же проблемой в течение трех дней и в конце, я просто пишу корректный путь в .bash_profile файле, который похож на это:

    export PATH=/Users/[YOURNAME]/development/flutter/bin:$PATH
  • note1: если у Вас нет .bash_profile, создают один и пишут строку выше
  • note2: архивируйте свой загруженный SDK дрожания в [доме] / разработка, если Вы копируете и вставляете этот путь
6
задан pablobm 2 September 2009 в 18:09
поделиться

4 ответа

e [0] не кодируется с помощью latin-1; просто так получилось, что байт \ xbd при декодировании как latin-1 является символом U + 00BD.

Преобразование происходит в Objects / floatobject.c .

Во-первых, юникод строка должна быть преобразована в байтовую строку. Это выполняется с помощью PyUnicode_EncodeDecimal () :

if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
                            PyUnicode_GET_SIZE(v),
                            s_buffer,
                            NULL))
        return NULL;

, который реализован в unicodeobject.c . Он не выполняет никакого преобразования набора символов, он просто записывает байты со значениями, равными порядковому номеру строки в кодировке Unicode. В этом случае U + 00BD -> 0xBD.

Оператор форматирует ошибку:

PyOS_snprintf(buffer, sizeof(buffer),
              "invalid literal for float(): %.200s", s);

где s содержит строку байтов, созданную ранее. PyOS_snprintf () записывает байтовую строку, а s является байтовой строкой, поэтому она просто включает ее напрямую.

8
ответ дан 8 December 2019 в 16:06
поделиться

Очень хороший вопрос!

Я взял на себя смелость покопаться в исходном коде Python, который представляет собой простую команду для правильной настройки дистрибутивов Linux ( apt-get source python2. 5 )

Черт , Джон Милликин меня опередил. Правильно, PyUnicode_EncodeDecimal - это ответ, который он делает здесь:

/* (Loop ch in the unicode string) */
    if (Py_UNICODE_ISSPACE(ch)) {
        *output++ = ' ';
        ++p;
        continue;
    }
    decimal = Py_UNICODE_TODECIMAL(ch);
    if (decimal >= 0) {
        *output++ = '0' + decimal;
        ++p;
        continue;
    }
    if (0 < ch && ch < 256) {
        *output++ = (char)ch;
        ++p;
        continue;
    }
    /* All other characters are considered unencodable */
    collstart = p;
    collend = p+1;
    while (collend < end) {
        if ((0 < *collend && *collend < 256) ||
            !Py_UNICODE_ISSPACE(*collend) ||
            Py_UNICODE_TODECIMAL(*collend))
            break;
    }

Видите, он оставляет все кодовые точки Unicode <256 на месте, которые являются символами latin-1, на основе обратной совместимости Unicode.


Addendum

После этого вы можете проверить, попробовав другие символы, отличные от latin-1, оно вызовет другое исключение:

>>> float(u"ħ")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'decimal' codec can't encode character u'\u0127' in position 0: invalid decimal Unicode string
5
ответ дан 8 December 2019 в 16:06
поделиться

Поэкспериментировав с вашим фрагментом кода, похоже, что у меня такое же поведение на моей платформе (Py2 .6 в OS X 10.5).

Поскольку вы установили, что e [0] закодирован с помощью latin-1 , правильный способ преобразовать его unicode - сделать ] .decode ('latin-1') и не unicode (e [0]) .

Обновление: Похоже, что e [0] делает не иметь действительной кодировки. Определенно не latin-1 . Из-за этого, как упоминалось в другом месте в комментариях, вам придется вызвать repr (e [0]) , если вам нужно отобразить это сообщение об ошибке, не вызывая каскадного исключения.

0
ответ дан 8 December 2019 в 16:06
поделиться

Кодировка ASCII включает только байты со значениями <= 127 . Диапазон символов, представленных этими байтами, идентичен в большинстве кодировок; другими словами, «A» - это chr (65) в ASCII, в latin-1, в UTF-8 и т. д.

Однако половина символа не является частью Набор символов ASCII, поэтому, когда Python пытается закодировать этот символ в ASCII, он ничего не может сделать, кроме как потерпеть неудачу.

Обновление: Вот что происходит (я предполагаю, что мы говорим о CPython):

float (u ' \ xbd ') приводит к вызову PyFloat_FromString в floatobject.c . Эта функция, предоставляя объект Unicode, в свою очередь вызывает PyUnicode_EncodeDecimal в unicodeobject.c вызываемого. От беглого просмотра кода, Я понял, что эта функция превращает объект unicode в строку, заменяя каждый символ кодовой точкой Unicode <256 байтом этого значения, т.е. половина символа, имеющая кодовую точку 189, превращается в chr (89) .

Затем PyFloat_FromString выполняет свою работу как обычно. На данный момент он работает с обычной строкой, которая, как оказалось, содержит байт диапазона, отличный от ASCII. Его это не волнует; он просто находит байт, который не является цифрой, точкой и т. п., поэтому возникает ошибка значения.

Аргументом этого исключения является строка

"invalid literal for float(): " + evil_string

Это нормально; сообщение об исключении - это, в конце концов, строка. Только когда вы пытаетесь декодировать эту строку, используя кодировку по умолчанию ASCII, это превращается в проблему.

256 с байтом этого значения, т.е. половина символа, имеющая кодовую точку 189, преобразуется в chr (89) .

Затем PyFloat_FromString выполняет свое работать как обычно. На данный момент он работает с обычной строкой, которая, как оказалось, содержит байт диапазона, отличный от ASCII. Его это не волнует; он просто находит байт, который не является цифрой, точкой и т.п., поэтому вызывает ошибку значения.

Аргументом этого исключения является строка

"invalid literal for float(): " + evil_string

Это нормально; сообщение об исключении - это, в конце концов, строка. Только когда вы пытаетесь декодировать эту строку, используя кодировку по умолчанию ASCII, это превращается в проблему.

256 с байтом этого значения, т. Е. Половина символа, имеющая кодовую точку 189, превращается в chr (89) .

Затем PyFloat_FromString выполняет свое работать как обычно. На данный момент он работает с обычной строкой, которая, как оказалось, содержит байт диапазона, отличный от ASCII. Его это не волнует; он просто находит байт, который не является цифрой, точкой и т.п., поэтому вызывает ошибку значения.

Аргументом этого исключения является строка

"invalid literal for float(): " + evil_string

Это нормально; сообщение об исключении - это, в конце концов, строка. Только когда вы пытаетесь декодировать эту строку, используя кодировку по умолчанию ASCII, это превращается в проблему.

PyFloat_FromString выполняет свою работу как обычно. На данный момент он работает с обычной строкой, которая, как оказалось, содержит байт диапазона, отличный от ASCII. Его это не волнует; он просто находит байт, который не является цифрой, точкой и т.п., поэтому вызывает ошибку значения.

Аргументом этого исключения является строка

"invalid literal for float(): " + evil_string

Это нормально; сообщение об исключении - это, в конце концов, строка. Только когда вы пытаетесь декодировать эту строку, используя кодировку по умолчанию ASCII, это превращается в проблему.

PyFloat_FromString выполняет свою работу как обычно. На данный момент он работает с обычной строкой, которая, как оказалось, содержит байт диапазона, отличный от ASCII. Его это не волнует; он просто находит байт, который не является цифрой, точкой и т.п., поэтому вызывает ошибку значения.

Аргументом этого исключения является строка

"invalid literal for float(): " + evil_string

Это нормально; сообщение об исключении - это, в конце концов, строка. Только когда вы пытаетесь декодировать эту строку, используя кодировку по умолчанию ASCII, это превращается в проблему.

Аргументом этого исключения является строка

"invalid literal for float(): " + evil_string

Это нормально; сообщение об исключении - это, в конце концов, строка. Только когда вы пытаетесь декодировать эту строку, используя кодировку по умолчанию ASCII, это превращается в проблему.

Аргументом этого исключения является строка

"invalid literal for float(): " + evil_string

Это нормально; сообщение об исключении - это, в конце концов, строка. Только когда вы пытаетесь декодировать эту строку, используя кодировку по умолчанию ASCII, это превращается в проблему.

2
ответ дан 8 December 2019 в 16:06
поделиться
Другие вопросы по тегам:

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