Строки C++: UTF-8 или 16-разрядное кодирование?

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

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

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 ");
        }
    }
}
12
задан Delan Azabani 12 August 2011 в 12:49
поделиться

8 ответов

Я рекомендовал бы UTF-16 для любого вида манипулирования данными и UI. API Mac OS X и Win32 использует UTF-16, то же для wxWidgets, QT, ICU, Xerces и других. UTF-8 мог бы быть лучше для обмена данными и устройства хранения данных. См. http://unicode.org/notes/tn12/ .

, Но независимо от того, что Вы выбираете, я определенно рекомендовал бы против станд.:: строка с UTF-8 "только, когда необходимый".

Идут полностью с UTF-16 или UTF-8, но не смешивают и соответствуют, который напрашивается на неприятности.

2
ответ дан 2 December 2019 в 03:19
поделиться

UTF-16 является все еще кодировкой символов переменной длины (существуют больше, чем 2^16 unicode кодовые точки), таким образом, Вы не можете сделать O (1) строковые операции индексации. При выполнении большого количества такой вещи Вы ничего не сохраняете в скорости по UTF-8. С другой стороны, если Ваш текст включает много кодовых точек в этих 256-65535 диапазонах, UTF-16 может быть существенным улучшением размера. UCS-2 является вариацией на UTF-16, который является фиксированная длина, за счет запрещения любых кодовых точек, больше, чем 2^16.

, не зная больше о Ваших требованиях, я лично пошел бы для UTF-8. Является самым легким иметь дело с по всем причинам, которые уже перечислили другие.

26
ответ дан 2 December 2019 в 03:19
поделиться

Я никогда не находил причин использовать что-либо еще, чем UTF-8, чтобы быть честным.

6
ответ дан 2 December 2019 в 03:19
поделиться

Если Вы решаете пойти с кодировкой UTF-8, проверьте эту библиотеку: http://utfcpp.sourceforge.net/

Это может сделать Вашу жизнь намного легче.

5
ответ дан 2 December 2019 в 03:19
поделиться

Я на самом деле записал широко используемое приложение (5 миллионов + пользователи), таким образом, каждый используемый килобайт складывает, буквально. Несмотря на это, я просто придерживался wxString. Я настроил его, чтобы быть полученным из станд.:: wstring, таким образом, я могу передать их функциям, ожидающим wstring const&.

Обратите внимание на то, что станд.:: wstring является собственным Unicode на Mac (№ UTF-16 было нужно для символов выше U+10000), и поэтому он использует 4 bytes/wchar_t. Большое преимущество этого состоит в том, что я ++ получаю Вас следующий символ, всегда. На Win32, который верен только в 99,9% случаев. Как такой же программист, Вы поймете, как небольшие 99,9%.

, Но если Вы не убеждены, запишите функцию в верхний регистр станд.:: строка [UTF-8] и станд.:: wstring. Те 2 функции скажут Вам, каким путем является безумие.

Ваш дисковый формат является другим вопросом. Для мобильности, которая должна быть UTF-8. Нет никакого беспокойства порядка байтов в UTF-8, ни обсуждения ширины (2/4). Это может быть то, почему много программ, кажется, используют UTF-8.

На немного несвязанной ноте, читайте на строковых сравнениях Unicode и нормализации. Или Вы закончите с той же ошибкой как.NET, где у Вас может быть две переменные föà ¶ и föà ¶ отличие только по (невидимой) нормализации.

4
ответ дан 2 December 2019 в 03:19
поделиться

MicroATX является в значительной степени стандартным форматом материнской платы ПК, самым способным к 4-8 ГБ RAM. Если Вы говорите picoATX, возможно, Вы ограничены 1-2 ГБ RAM. Даже тогда это - много для среды разработки. Я все еще придерживался бы UTF-8 по упомянутым выше причинам, но память не должна быть Вашим беспокойством.

2
ответ дан 2 December 2019 в 03:19
поделиться

Из того, что я читал, лучше использовать 16-разрядное кодирование внутренне, если Вы не коротки на памяти. Это соответствует почти всем живым языкам в одном символе

, я также посмотрел бы ICU. Если Вы не собираетесь быть использующими определенными функциями STL строк, использование строковых типов ICU могло бы быть лучше для Вас.

1
ответ дан 2 December 2019 в 03:19
поделиться

Вы рассмотрели использование wxStrings? Если я помню правильно, они могут сделать utf-8 <-> преобразования Unicode и это сделают это немного легче, когда необходимо будет передать строки и от UI.

0
ответ дан 2 December 2019 в 03:19
поделиться
Другие вопросы по тегам:

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