Индексировать символ в массиве wchar_t
Поток " Размер wchar_t* для суррогатной пары" показывает, что размер памяти, необходимый для сохранения значения wchar_t, может отличаться, поскольку для кодирования некоторых символов (суррогатной пары) может потребоваться больше места. Это приводит меня к следующему вопросу: как мне тогда перемещаться по массиву значений wchar_t? Потому что теперь я не могу просто увеличивать или уменьшать текущий адрес на фиксированный размер wchar_t.
ИСПРАВЛЕНИЕ: "Как мне затем перемещаться по массиву значений wchar_t" я имел в виду, как вы перемещаетесь между кодовыми точками, которые могут быть представлены переменным числом значений wchar_t.
4 ответа
Размер wchar_t
может отличаться в разных системах, но это определенно и исправлено во время выполнения или компиляции на машине.
Вы можете получить его размер оператором sizeof
а также вы можете перебирать его так же, как и другие типы.
Тип wchar_t
на основе конкретной локали имеет максимальный размер для хранения символа. Таким образом, сопоставление между строковыми единицами кода и символами текста является взаимно-однозначным, поэтому не беспокойтесь об итерации по символам широкой строки, так же как и другим типам для чтения следующего или предыдущего символа. (В отличие от Юникода)
Тем не менее, это единственная яркая часть wchar_t
строки. Использование их в качестве общего способа хранения любой произвольной строки - задача не из легких. Таким образом, вы должны использовать Unicode-осведомленные вещи. Соответствующие вопросы и ответы здесь.
Не использовать wchar_t
выполнять манипуляции со строками Unicode. Серьезно, просто не надо. Как вы уже заметили, нет однозначного соответствия wchar_t
объекты и кодовые точки Unicode. Используйте библиотеку, такую как ICU, чтобы манипулировать текстом Unicode.
Здесь есть несколько проблем, и использование библиотеки, такой как ICU, поможет вам избежать многих проблем. Проблема с суррогатными символами в UTF-16 - не единственная проблема, если вы пытаетесь считать "символы".
Если вам просто нужно пройти строку wchar_t, значения для суррогатных значений однозначно определяются как начальное значение (от 0xd800 до 0xdbff), за которым следует конечное значение (от 0xdc00 до 0xdfff). Вы можете использовать эти знания, чтобы идти вперед или назад по массиву, считающему "символы". Это предполагает, что у вас есть действительный набор значений.
Другой проблемой являются значения в потоке, которые сами по себе не являются символами. Например, U+0301 - КОМБИНИРОВАНИЕ ОСТРОГО АКЦЕНТА с добавлением акцента к предыдущему значению. Это может быть проблемой при использовании UTF-8, UTF-16 или UTF-32.
Этот ответ проясняет природу wchar_t
как тип. Казалось, что это было неправильно понято до того, как в вопрос добавили "ИСПРАВЛЕНИЕ".
Как с любым конкретным типом, sizeof(wchar_t)
постоянна для конкретной системы, как есть sizeof(wchar_t *)
,
В языковых терминах вы можете перемещаться по массиву wchar_t
так же, как вы можете перемещаться по массиву любого другого типа.
Тем не менее, работа с текстовыми символами, закодированными с различными номерами wchar_t
С другой и гораздо более сложный вопрос. Другие ответы в какой-то степени касались этого.