Могут ли возникнуть проблемы с работой со строками если использовать не char* /const char*, а unsigned char*/const unsigned char*?
Если все правильно, к примеру, в UTF-8, каждый символ имеет свой индекс в диапазоне от 1-255. В случае в char* диапазон будет другой.
2 Answers
В UTF8 символы не имеют индекса в диапазоне 1-255, а занимают от 1 до 6 байт с переносом. Для строк в кодировке UTF8 С++20 вводит отдельный тип char8_t.
- 29,796
Несмотря на то, что char, unsigned char и signed char - это три разных типа, представление простого char может быть как знаковым, так и беззнаковым. Это определяется реализацией компилятора. Поэтому говорить о каких-то проблемах можно лишь с учётом конкретного компилятора и функции, обрабатывающей массив таких символов (строк в данной интерпретации). Например, для функций из <cctype>, в частности std::isalnum требуется чтобы символ был представим диапазоном unsigned char и для безопасного использования требуется соответствующее приведение типа:
To use these functions safely with plain chars (or signed chars), the argument should first be converted to
unsigned char
Иначе, результатом может быть неопределённое поведение.
- 28,987
- 13
- 60
- 119
char8_tописывает кодовую единицу для UTF-8, а не символ в общем случае. – αλεχολυτ May 15 '19 at 08:49