Здесь есть пара функций кодирования строк. А именно:
1. Кодировка символов
Существует много способов кодирования строк. char
не подразумевает 1-байтовые символы. Многобайтовые наборы символов (MBCS) существовали в течение десятилетий до Unicode, и, вероятно, именно так ваш компилятор интерпретирует буквальные китайские символы. Если вы посмотрите в память, которая представляет эту строку, вы почти наверняка увидите, что символы представлены более чем 1 байтом каждый.
Это общий источник головной боли, и причина Unicode была задумано. Все должно использовать одинаковую кодировку символов для правильного представления строки. Между вашим текстовым файлом, сохраненным на диске, вашим компилятором, вашим кодом, который обрабатывает строку (и всеми библиотеками, такими как std::
), потоком, в который вы пишете, шрифтом ... все должно согласовываться с кодировкой.
Мы избегаем этой головной боли в наше время, используя Unicode некоторой формы.
Самый короткий ответ, хотя здесь, это то, что это зависит от того, как ваш компилятор интерпретирует ваш источник. Это определяется реализацией, и обычно есть специфический для компилятора способ указания этого поведения c (для msv c: /utf-8
).
Это означает, что ваш второй пример , который предполагает, что символы по 1 байту каждый, может быть успешным, только если ваш компилятор работает с кодировкой, в которой эти символы помещаются в один байт, что, я подозреваю, невозможно. Таким образом, компилятор усекается до 1 символа, и вы получите в основном мусор.
2. Нулевое окончание
Строки, как правило, заканчиваются нулем в C или C ++, то есть после последнего символа значение 0
обозначает конец строки. Строка типа abc
представлена в памяти в виде 4 байтов: 'a', 'b', 'c', 0
В первом примере компилятор автоматически добавляет для вас символ завершения нуля.
Во втором примере , нет нулевого терминатора. Поэтому, когда вы печатаете строку в консоли, процедура печати не знает, какова длина вашей строки, и печатает, пока не найдет ноль в мусорной памяти.