2015-11-09 3 views
1

Рассмотрим следующее утверждение -Если компилятор C++ поддерживает набор символов Unicode, необходимо ли, чтобы базовый набор символов был также Unicode?

COUT Он отображает знак интеграции (символов Unicode), если компилируется на моей г ++ 4.8.2

1). Означает ли это, что основной набор символов этой реализации также является Unicode?

Если да, то рассмотрим следующее утверждение -

C++ определяет понятия 'байт' по-разному. Байт C++ состоит из достаточного количества. бит для размещения, по меньшей мере, общего количества. символов базового набора символов для реализации.

2). Если мой компилятор поддерживает Unicode, то бит no.of в байте в соответствии с приведенным выше определением байта должен быть больше 8. Следовательно CHAR_BIT> 8 здесь, правильно? Но мой компилятор показывает CHAR_BIT == 8. ПОЧЕМУ?

Ссылка: C++ Primer Plus

P.S. Я новичок. Не бросайте меня в сложные технические детали. Держите его простым и прямым. Заранее спасибо!

ответ

1

Означает ли это, что базовый набор символов этой реализации также является Unicode?

Нет, такого требования нет, и существует очень мало реализаций, где char достаточно велик для хранения произвольных символов Юникода.

char достаточно большой, чтобы содержать элементы базового набора символов, но то, что происходит с символами, которые не находятся в базовом наборе символов, зависит.

В некоторых системах все может быть преобразовано в один набор символов, такой как ISO8859-1, который имеет менее 256 символов, поэтому полностью помещается в char.

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

0

Многие компиляторы поддерживают UTF-8, а основной набор символов - ASCII. В UTF-8 кодовая точка Юникода состоит из 1-4 байта, поэтому обычно от 1 до 4 символов. UTF-8 разработан таким образом, что большинство C и C++ отлично справляются с этим без непосредственной поддержки. Просто имейте в виду, что, например, strlen() возвращает количество байтов, а не количество кодовых точек. Но большую часть времени вам это совсем неинтересно. (Такие функции, как strncpy, которые опасны, в любом случае становятся немного более опасными с UTF-8).

И, конечно, забудьте об использовании символа для хранения кодовой точки Юникода. Но после того, как вы перейдете к более сложной обработке строк, многие, многие вещи не могут быть выполнены на уровне персонажа.

2

Unicode не имеет ничего общего с вашим компилятором или C++, определяющим «байты» по-разному. Это просто разделение понятия «байт» и «символ» на уровне строки и только на уровне строк.

Единственный раз, когда многобайтовые символы Unicode входят в игру, отображаются во время отображения и при манипулировании строками. См. Также the difference between std::wstring and std::string для получения более подробного пояснения.

Компилятор только компилирует. Он не заботится о вашем наборе символов, кроме случаев, когда дело касается исходного кода.

Байты, как всегда, 8 бит.

+1

* Байты, как всегда, только 8 бит. * Это неверно. Существует не defenitve стандарт, который говорит, что байт составляет 8 бит, и есть машины, которые используют большие слова. http://stackoverflow.com/questions/5516044/system-where-1-byte-8-bit – NathanOliver

+0

Исторически говоря, да, и в некоторых действительно странных случаях это верно, но редкий программист, который * когда-либо * должен иметь дело с этим. Кроме того, довольно уверенная, что любая система с не-8-битными байтами не поддерживает Unicode любым способом. Конечно, есть исключения из любого правила, но общий принцип здесь - это байты только 8 бит и 8 бит. Определения для «коротких» и «длинных» гораздо более субъективны. – tadman

Смежные вопросы