Я не уверен, что отвечаю на ваш вопрос, но позвольте мне сделать несколько замечаний, которые, мы надеемся, проливают некоторый свет.
В основном, языки программирования общего назначения, такие как те, о которых мы говорим(C, C ++, C #, Java, PHP) не имеют понятия «текст», просто «данные».Данные состоят из последовательностей целочисленных значений (то есть чисел).За этими числами нет неотъемлемого значения .
Процесс превращения потока чисел в текст является одной из семантики, и потребитель обычно назначает соответствующую семантику.в поток данных.
Предупреждение: Теперь я буду использовать слово «кодировка», которое, к сожалению, имеет несколько неэквивалентных значений.Первое значение «кодирования» - это присвоение значения номеру.Семантическая интерпретация числа также называется «символ».Например, в кодировке ASCII 32 означает «пробел», а 65 означает «капитал А».ASCII присваивает значения только 128 числам, поэтому каждый ASCII символ может быть удобно представлен одним 8-битным байтом (с верхним битом всегда 0).Существует много кодировок с назначением символов для 256 чисел, поэтому все используют один байт на символ.В этих кодировках фиксированной ширины текстовая строка имеет столько символов, сколько требуется для представления байтов.Существуют также другие кодировки, в которых символы принимают переменное количество байтов для представления.
Теперь Unicode также является кодировкой, то есть назначением значения для чисел.На первых 128 числах он такой же, как ASCII, но он присваивает значения (теоретически) 2 ^ 21 числам.Поскольку существует множество значений, которые не являются строго «символами» в смысле написания (например, столяры с нулевой шириной или диакритические модификаторы), термин «кодовая точка» предпочтительнее «символа».Тем не менее, любой интегральный тип данных шириной не менее 21 бита может представлять одну кодовую точку.Обычно выбирается 32-битный тип, и это кодирование, в котором каждый элемент обозначает одну кодовую точку, называется UTF-32 или UCS-4.
Теперь у нас есть второе значение «кодирования»: Iможет взять строку кодовых точек Unicode и преобразовать в строку из 8-битных или 16-битных значений, тем самым дополнительно «кодируя» информацию.В этой новой преобразованной форме (называемой «формат преобразования Unicode» или «UTF») теперь у нас есть строки 8-битных или 16-битных значений (называемых «единицами кода»), но каждое отдельное значение в общем случае не соответствуетк чему-либо значимому - сначала его нужно декодировать в последовательность кодовых точек Unicode.
Таким образом, с точки зрения программирования, если вы хотите изменить текст (не байты), тогда выдолжен хранить ваш текст как последовательность кодов Unicode.Практически это означает, что вам нужен 32-битный тип данных.Тип данных char
в C и C ++ обычно имеет ширину 8 бит (хотя это только минимум), тогда как в C # и Java он всегда имеет ширину 16 бит.Предполагается, что 8-битный символ может использоваться для хранения преобразованной строки UTF-8, а 16-битный символ может хранить преобразованную строку UTF-16, но для того, чтобы получитьв необработанных, значимых кодовых точках Unicode (и, в частности, в длине строки в кодовых точках) вам всегда придется выполнять декодирование.
Обычно библиотеки обработки текста могут выполнять декодирование и кодирование для вас.Таким образом, они с радостью примут строки UTF8 и UTF16 (но по цене), но если вы хотите сэкономить эту дополнительную косвенность, сохраняйте строки в виде необработанных кодовых точек Юникода в достаточно широком типе.