Python, Unicode и консоль Windows

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
127
задан Community 23 May 2017 в 10:31
поделиться

3 ответа

Примечание: Этот ответ является видом устаревших (с 2008). Используйте решение ниже с осторожностью!!

<час>

Вот страница, которая детализирует проблему, и решение (ищите страницу текст Обертывание sys.stdout в экземпляр ):

PrintFails - Python Wiki

Здесь является выборкой кода от той страницы:

$ python -c 'import sys, codecs, locale; print sys.stdout.encoding; \
    sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout); \
    line = u"\u0411\n"; print type(line), len(line); \
    sys.stdout.write(line); print line'
  UTF-8
  <type 'unicode'> 2
  Б
  Б

  $ python -c 'import sys, codecs, locale; print sys.stdout.encoding; \
    sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout); \
    line = u"\u0411\n"; print type(line), len(line); \
    sys.stdout.write(line); print line' | cat
  None
  <type 'unicode'> 2
  Б
  Б

существует еще некоторая информация на той странице, определенно стоящей чтения.

36
ответ дан 24 November 2019 в 00:47
поделиться

Причина Вашей проблемы НЕ консоль Win, не готовая принять Unicode (поскольку это делает это, так как я предполагаю Win2k по умолчанию). Это - системное кодирование по умолчанию. Попробуйте этот код и посмотрите то, что он дает Вам:

import sys
sys.getdefaultencoding()

, если это говорит, что ASCII, существует Ваша причина ;-) Необходимо создать файл, названный sitecustomize.py, и положить его под путь Python (я поместил его под/usr/lib/python2.5/site-packages, но это - differen на Win - это - c:\python\lib\site-packages или что-то), со следующим содержанием:

import sys
sys.setdefaultencoding('utf-8')

и возможно Вы могли бы хотеть указать кодирование в своих файлах также:

# -*- coding: UTF-8 -*-
import sys,time

Редактирование: больше информации может быть найдено в превосходном Погружение в книгу

Python
2
ответ дан 24 November 2019 в 00:47
поделиться

Приведенный ниже код заставит Python выводить в консоль как UTF-8 даже на Windows.

Консоль будет хорошо отображать символы в Windows 7, но в Windows XP она не будет их хорошо отображать, но, по крайней мере, это будет работать, и, что самое важное, вы будете иметь последовательный вывод от вашего скрипта на всех платформах. Вы сможете перенаправить вывод в файл.

Нижеприведенный код был протестирован на Python 2.6 под Windows.


#!/usr/bin/python
# -*- coding: UTF-8 -*-

import codecs, sys

reload(sys)
sys.setdefaultencoding('utf-8')

print sys.getdefaultencoding()

if sys.platform == 'win32':
    try:
        import win32console 
    except:
        print "Python Win32 Extensions module is required.\n You can download it from https://sourceforge.net/projects/pywin32/ (x86 and x64 builds are available)\n"
        exit(-1)
    # win32console implementation  of SetConsoleCP does not return a value
    # CP_UTF8 = 65001
    win32console.SetConsoleCP(65001)
    if (win32console.GetConsoleCP() != 65001):
        raise Exception ("Cannot set console codepage to 65001 (UTF-8)")
    win32console.SetConsoleOutputCP(65001)
    if (win32console.GetConsoleOutputCP() != 65001):
        raise Exception ("Cannot set console output codepage to 65001 (UTF-8)")

#import sys, codecs
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
sys.stderr = codecs.getwriter('utf8')(sys.stderr)

print "This is an Е乂αmp١ȅ testing Unicode support using Arabic, Latin, Cyrillic, Greek, Hebrew and CJK code points.\n"
10
ответ дан 24 November 2019 в 00:47
поделиться
Другие вопросы по тегам:

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