Длина строк равна размеру байта?

Точно так: длина строк равна размеру байта? Это имеет значение на языке?

Я думаю, что это так, но я просто хочу убедиться.

Дополнительная информация: Мне просто интересно в целом. Моей конкретной ситуацией был PHP с MySQL.

Как ответ - нет, все, что мне нужно знать.

Ответы

Ответ 1

Неа. Строка с нулевым завершением содержит один дополнительный байт. Строка pascal (Shortstring Delphi) имеет дополнительный байт для длины. И строки Unicode имеют более одного байта на символ.

В юникоде это зависит от кодировки. Это может быть 2 или 4 байта на символ или даже комбинация 1,2 и 4 байта.

Ответ 2

Все зависит от платформы и представления.

Например, в .NET строка берет два байта в памяти по кодовой точке UTF-16. Однако для суррогатных пар требуется два значения UTF-16 для полного символа Юникода в диапазоне U + 100000 до U + 10FFFF. Форма в памяти также имеет накладные расходы на длину строки и, возможно, некоторое заполнение, а также нормальные служебные данные объекта указателя типа и т.д.

Теперь, когда вы пишете строку на диск (или сеть и т.д.) из .NET, вы указываете кодировку (с большинством классов по умолчанию UTF-8). В этот момент размер зависит от кодировки. ASCII всегда принимает один байт на символ, но очень ограничен (без акцентов и т.д.); UTF-8 дает полный диапазон Unicode с переменным кодированием (все символы ASCII представлены в одном байте, но другие занимают больше). UTF-32 всегда использует ровно 4 байта для любого символа Юникода - список продолжается.

Как вы можете видеть, это не простая тема. Чтобы определить, сколько места займет строка, вам нужно точно указать, в чем заключается ситуация - будь то объект в памяти на какой-либо платформе (и если да, то какая платформа - возможно, даже до внедрения и работы системные настройки), или это необработанная закодированная форма, такая как текстовый файл, и если да, используя эту кодировку.

Ответ 3

Это зависит от того, что вы подразумеваете под "длиной". Если вы имеете в виду "количество символов", то нет, многие языки/методы кодирования используют более одного байта на символ.

Ответ 4

Не всегда, это зависит от кодировки.

Ответ 5

Нет единого ответа; это зависит от языка и реализации (помните, что некоторые языки имеют несколько реализаций!)

Строки ASCII с нулевым завершением занимают как минимум еще один байт, чем "содержимое" строки. (Дополнительно может быть выделено в зависимости от того, как была создана строка.)

Строки с нулевым завершением используют дескриптор (или подобную структуру) для записи длины, которая где-то занимает дополнительную память.

Строки Unicode (на разных языках) используют два байта за char.

Строки в хранилище объектов можно ссылаться с помощью дескрипторов, что добавляет слой косвенности (и больше данных), чтобы упростить управление памятью.

Ответ 6

Вы правы. Если вы кодируете ASCII, для каждого символа есть один байт. В противном случае это один или несколько байтов на символ.

В частности, важно знать, как это влияет на подстроку. Если у вас нет одного байта на символ, s [n] получает n-й байт или nth char? Получение nth char будет неэффективным для больших n вместо констант, так как оно имеет один байт на символ.