unsigned char * - это в основном байтовый массив, и его следует использовать для представления необработанных данных, а не строки в целом. Строка Unicode будет представлена как wchar_t *
В соответствии со стандартом C ++ reinterpret_cast между unsigned char * и char * безопасен, поскольку они имеют одинаковый размер и одинаковую конструкцию и ограничения. Я стараюсь избегать reintrepret_cast даже больше, чем const_cast в целом.
Если статическое приведение не удается с тем, что вы делаете, вы, возможно, захотите пересмотреть свой дизайн, потому что, честно говоря, если вы используете C ++, вы можете воспользоваться тем, что предлагает часть «плюс плюс», и использовать строковые классы и STL (aka std :: basic_string может работать лучше для вас)