Замена символов из строки

Мой код следующий (сокращенный):

CComVariant * input является входным параметром

    CString cstrPath(input ->bstrVal);    
    const CHAR cInvalidChars[] = {"/*&#^°\"§$[]?´`\';|\0"};
    for (unsigned int i = 0; i < strlen(cInvalidChars); i++)
    {
       cstrPath.Replace(cInvalidChars[i],_T(''));
    }

При отладке значение cstrPath равно L"§", значение cInvalidChars[7] равно -89 '§'

Я пытался использовать.Remove() раньше, но проблема остается той же: когда дело доходит до § или ´, таблица кодов, кажется, не совпадает, и символ не распознается должным образом и не будет удален. использование массива TCHAR для invalidChars приводит даже к различным проблемам ('§' -> 'ᄡ'). Кажется, проблема в том, что я не использую правильные кодовые таблицы, но все, что я пробовал до сих пор, не привело ни к какому успеху. Я хочу успешно заменить / удалить любой встречающийся '§'..

Я также посмотрел несколько "Удалить символ из строки"-Posts, но я не нашел ничего, что мне помогло.

исполняемый код:

CComVariant* pccovaValue = new CComVariant();
pccovaValue->bstrVal = L"§§";

const CHAR cInvalidChars[] = {"§"};
CString cstrPath(pccovaValue->bstrVal);

for (unsigned int i = 0; i < strlen(cInvalidChars); i++)
{
    cstrPath.Remove(cInvalidChars[i]);
}

cstrPath = cstrPath;

просто взломать cstrPath = cstrPath;

1 ответ

Решение

Согласно комментариям, вы смешиваете кодировки Unicode и ANSI. Кажется, что ваше приложение нацелено на Unicode, что хорошо. Вы должны полностью прекратить использование ANSI.

декларировать cInvalidChars как это:

CString cInvalidChars = L"/*&#^°\"§$[]?´`\';|";

Использование L Префикс означает, что строковый литерал является широким символом литерала UTF-16.

Тогда ваш цикл может выглядеть так:

for (int i = 0; i < cInvalidChars.GetLength(); i++)
    cstrPath.Remove(cInvalidChars[i]);
Другие вопросы по тегам