Почему один и тот же символ интерпретируется по-разному?
Я считал бинарный файл в массив 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.