2

Могут ли возникнуть проблемы с работой со строками если использовать не char* /const char*, а unsigned char*/const unsigned char*? Если все правильно, к примеру, в UTF-8, каждый символ имеет свой индекс в диапазоне от 1-255. В случае в char* диапазон будет другой.

calm27
  • 2,904

2 Answers2

3

В UTF8 символы не имеют индекса в диапазоне 1-255, а занимают от 1 до 6 байт с переносом. Для строк в кодировке UTF8 С++20 вводит отдельный тип char8_t.

user7860670
  • 29,796
  • 1
    Стоит заметить, что char8_t описывает кодовую единицу для UTF-8, а не символ в общем случае. – αλεχολυτ May 15 '19 at 08:49
3

Несмотря на то, что 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