Почему один и тот же символ интерпретируется по-разному?

Я считал бинарный файл в массив vector<vector<unsigned char>> memblock;

if (hFind != INVALID_HANDLE_VALUE)
{
    do {
        std::cout << data.cFileName << std::endl;
        memblock.resize(counter + 1);
        std::string temp_name = data.cFileName;

        ifstream file("C:\\Users\\Elvin\\Documents\\all_configs\\"+temp_name, ios::in | ios::binary | ios::ate);
        if (file.is_open())
        {
            size = file.tellg();
            memblock[counter].resize(size);
            file.seekg(0, ios::beg);
            char buf[10000]="\0";
            file.read(buf, size);
            //memcpy(memblock[counter].data(), buf, sizeof(char)*strlen(buf));
            hand_copy_reduce(buf, memblock[counter],size);
            file.close();

            cout << "the entire file content is in memory";
        }
        counter++;
    } while (FindNextFile(hFind, &data));

    FindClose(hFind);
    comapre(memblock);

В функции compare есть матрица,где в строках есть такой символ "¸". Этот символ имеет код 184 и VS думает, что это буква "ё". Но когда я делаю проверку этого символа напрямую в if, VS утверждает,что это знак вопроса: введите сюда описание изображения

Функция:

unsigned char BOUND;//символ гранцы поля
void comapre(vector<vector<unsigned char>>& memblock)
{
    int i = 0;
    while (i<memblock.size())
    {
        if (memblock[i].size()==0)
        {
            memblock.erase(memblock.begin() + i);
        }
        else i++;
    }//строки длины 0 удалены

    unsigned int* min_array;
    min_array = new unsigned int[memblock.size()];
    memset(min_array, 0, memblock.size());
    for (int i = 0; i < memblock.size(); i++)
    {
        min_array[i] = memblock[i].size();
    }
    sort(min_array, min_array + memblock.size());//узнали длину минимальной строки матрицы, 
    //где будем искать совпадения между всеми строками


    //ищем совпадения
    unsigned char a = 0;
    int count = 0;
        for (int i = 0; i < min_array[0]; i++)
        {
            int j = 0;
            for (; j < memblock.size(); j++)
            {
                if (j == 0) a = memblock[j][i];
                if (memblock[j][i] == a)
                    count++;
            }
            j--;
            if (count-1 == memblock.size() && (memblock[j][i]=='¸' || memblock[j][i] == ':' || memblock[j][i] == '=' || memblock[j][i] == ';'))
            {
                BOUND = memblock[j][i];
                count = 0;
            }

        }
    //BOUND = 184;

}

Ответы (1 шт):

Автор решения: user7860670

Символ "¸", ака Cedilla занимает как минимум два байта. Соответственно он не может быть представлен одним char или индексирован в однобайтовой строке. Используйте итерацию по utf8 символам и сравнение подстроки с utf8 строкой. Ну или используйте двухбайтовые wchar_t.

→ Ссылка