Длина строк равна размеру байта?
Точно так: длина строк равна размеру байта? Это имеет значение на языке?
Я думаю, что это так, но я просто хочу убедиться.
Дополнительная информация: Мне просто интересно в целом. Моей конкретной ситуацией был 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 вместо констант, так как оно имеет один байт на символ.