Я пытаюсь включить этот ввод: "²³" в "2,3", и если это не "²³", чтобы вернуть "нет",
Ожидаемый результат:
Введите ключ: ²³ Перевод: 2,3,
Реальный результат:
Введите ключ: ²³ Перевод: NoNoNoNo
Код:
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
// To Compile: g++ x.cpp -o x
using namespace std;
//Define the functions
string convert( string text);
int main()
{
string d;
string input;
string cleartext;
cout << "Enter the key: ";
cin >> input;
vector <string> key ( input.size() ); // Make a vector with the size of their input
for (int i = 0; i < input.size(); i++) // Fill the vector with the characters given
{
key.at(i)=input[i];
d = convert( key[i]);
cleartext.append(d);
}
cout << "Translated: " << cleartext << endl;
return 0;
}
string convert( string text)
{
if (text == "²")
{
return "2,";
}
if (text == "³")
{
return "3,";
}
return "No";
}
Я не могу заставить его работать должным образом и довольно сильно. Я предполагаю, что он должен что-то делать с запятой, может ли кто-нибудь добавить понимание?
Это выглядит так, как будто вы обрабатываете кодированные данные UTF-8, надеясь, что каждая кодовая точка Юникода вписывается в char
. Учитывая, что Unicode использует не менее 20 бит (в прошлый раз меня интересовали эти темы, я так понимаю, что с тех пор, как они переместились на 24 бита, но я не подтвердил это утверждение), это не сработает. Ваши символы SUPERSCRIPT TWO (U + 00B2) и SUPERSCRIPT THREE (U + 00B3) будут использовать два байта, если они представлены с использованием UTF-8. Учитывая, что ввод двух символов приводит к тому, что "Нет" печатается в четыре раза, довольно много подкрепляет это предположение.
При обработке Unicode вам, вероятно, лучше использовать широкую строку символов, например std::basic_string<char32_t>
хотя я не думаю, что потоки этого типа символов должны быть определены. До тех пор, пока вы обрабатываете специальный символ отдельно, вы, вероятно, можете уйти с помощью std::wstring
в большинстве случаев, хотя wchar_t
использует только 16 бит на некоторой платформе и, таким образом, будет кодировать символы, используя UTF-16 в этом случае.