Есть ли такая вещь, как не-utf8 символ - PullRequest
0 голосов
/ 03 октября 2019

Попытка реализовать код на С ++, где мы могли бы использовать символ не-utf8, чтобы быть разделителем внутри std :: string.

Есть ли такая вещь, как символ не-UTF-8?

Ответы [ 3 ]

2 голосов
/ 03 октября 2019

std::string знает только о необработанных char значениях, он ничего не знает о конкретных кодировках символов, которые используют char для хранения закодированных значений.

Многие распространенные реализации UTF-8 используют char для хранениякодированные блоки кода (хотя C ++ 20 вместо этого введет char8_t и std::u8string для этой цели). Но другие кодировки символов (Windows-12 ##, ISO-8859- # и т. Д.) Также могут помещать свои закодированные значения в элементы char.

Любое значение char, попадающее в диапазон ASCII(0x00 .. 0x7F) поместится в 1 char и отобразится на то же значение кодовой точки в Unicode (U + 0000 .. U + 007F), но на любое значение char в диапазоне ANSI, но не в диапазоне ASCII (0x80 .. 0xFF) подлежит интерпретации любой кодировкой символов, создавшей значения char. Некоторые кодировки используют 1 char на символ, другие используют несколько char s.

Так что да, есть такая вещь, как "не-UTF-8 char".

1 голос
/ 03 октября 2019

Да. 0xC0, 0xC1, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF - недопустимые единицы кода UTF-8 . Единица кода UTF-8 составляет 8 бит. Если под char вы подразумеваете 8-битный байт, то недопустимыми единицами кода UTF-8 будут значения char, которые не появляются в кодированном тексте UTF-8.

0 голосов
/ 03 октября 2019

Вы можете проверить стандарт UTF-8 на Wiki . Не каждая последовательность байтов является допустимым символом UTF-8. Даже если это один байт: 0x11111000, 0x11111111 не являются допустимыми первыми байтами в UTF-8.

Хотя я сомневаюсь, что в качестве разделителя целесообразно использовать не-UTF-8 символ. Вы можете обнаружить, что у определенной программы (например, Notepad ++) есть проблемы с чтением вывода ваших строк.

...