multi-character constant при использовании кириллицы в map
Я хочу сделать словарь, чтобы использовать его в цикле и менять введенный текст посимвольно, сравнивая его со словарём, но у меня выдает ошибку multi-character constant
P.S. если заменить ключи на английские буквы, то всё работает нормально, но мне нужен русский; замена кавычек с ординарных на двойные так же не делает никакой погоды; смена char на string тоже не помогла.
#include <iostream>
#include <iterator>
#include <map>
using namespace std;
int main() {
setlocale(LC_ALL, "Russian");
map <char, string> fontDictionary =
{
{'а', "А"},
{'б', "6"},
{'в', "B"},
{'г', "G"},
{'д', "D"},
{'е', "E"},
{'ё', "E"},
{'ж', "}I{"},
{'з', "3"},
{'и', "U"},
{'й', "u"},
{'к', "K"},
{'л', "JI"},
{'м', "M"},
{'н', "H"},
{'о', "O"},
{'п', "II"},
{'р', "P",},
{'с', "C"},
{'т', "T"},
{'у', "y"},
{'ф', "o|o"},
{'х', "X"},
{'ц', "Ul"},
{'ч', "4"},
{'ш', "W"},
{'щ', "W"},
{'ъ', "b"},
{'ы', "bI"},
{'ь', "b"},
{'э', "e"},
{'ю', "IO"},
{'я', "9"},
};
string toBeChanged;
cin >> toBeChanged;
return 0;
}
Код ошибки в терминале:
grxxndxxm@grxxndxxm:~/Desktop$ g++ CS16Font.cpp -o CS16
CS16Font.cpp:13:10: warning: multi-character character constant [-Wmultichar]
13 | {'а', "А"},
| ^~~~
CS16Font.cpp:14:10: warning: multi-character character constant [-Wmultichar]
14 | {'б', "6"},
| ^~~~
CS16Font.cpp:15:10: warning: multi-character character constant [-Wmultichar]
15 | {'в', "B"},
| ^~~~
CS16Font.cpp:16:10: warning: multi-character character constant [-Wmultichar]
16 | {'г', "G"},
| ^~~~
CS16Font.cpp:17:10: warning: multi-character character constant [-Wmultichar]
17 | {'д', "D"},
| ^~~~
CS16Font.cpp:18:10: warning: multi-character character constant [-Wmultichar]
18 | {'е', "E"},
| ^~~~
CS16Font.cpp:19:10: warning: multi-character character constant [-Wmultichar]
19 | {'ё', "E"},
| ^~~~
CS16Font.cpp:20:10: warning: multi-character character constant [-Wmultichar]
20 | {'ж', "}I{"},
| ^~~~
CS16Font.cpp:21:10: warning: multi-character character constant [-Wmultichar]
21 | {'з', "3"},
| ^~~~
CS16Font.cpp:22:10: warning: multi-character character constant [-Wmultichar]
22 | {'и', "U"},
| ^~~~
CS16Font.cpp:23:10: warning: multi-character character constant [-Wmultichar]
23 | {'й', "u"},
| ^~~~
CS16Font.cpp:24:10: warning: multi-character character constant [-Wmultichar]
24 | {'к', "K"},
| ^~~~
CS16Font.cpp:25:10: warning: multi-character character constant [-Wmultichar]
25 | {'л', "JI"},
| ^~~~
CS16Font.cpp:26:10: warning: multi-character character constant [-Wmultichar]
26 | {'м', "M"},
| ^~~~
CS16Font.cpp:27:10: warning: multi-character character constant [-Wmultichar]
27 | {'н', "H"},
| ^~~~
CS16Font.cpp:28:10: warning: multi-character character constant [-Wmultichar]
28 | {'о', "O"},
| ^~~~
CS16Font.cpp:29:10: warning: multi-character character constant [-Wmultichar]
29 | {'п', "II"},
| ^~~~
CS16Font.cpp:30:10: warning: multi-character character constant [-Wmultichar]
30 | {'р', "P",},
| ^~~~
CS16Font.cpp:31:10: warning: multi-character character constant [-Wmultichar]
31 | {'с', "C"},
| ^~~~
CS16Font.cpp:32:10: warning: multi-character character constant [-Wmultichar]
32 | {'т', "T"},
| ^~~~
CS16Font.cpp:33:10: warning: multi-character character constant [-Wmultichar]
33 | {'у', "y"},
| ^~~~
CS16Font.cpp:34:10: warning: multi-character character constant [-Wmultichar]
34 | {'ф', "o|o"},
| ^~~~
CS16Font.cpp:35:10: warning: multi-character character constant [-Wmultichar]
35 | {'х', "X"},
| ^~~~
CS16Font.cpp:36:10: warning: multi-character character constant [-Wmultichar]
36 | {'ц', "Ul"},
| ^~~~
CS16Font.cpp:37:10: warning: multi-character character constant [-Wmultichar]
37 | {'ч', "4"},
| ^~~~
CS16Font.cpp:38:10: warning: multi-character character constant [-Wmultichar]
38 | {'ш', "W"},
| ^~~~
CS16Font.cpp:39:10: warning: multi-character character constant [-Wmultichar]
39 | {'щ', "W"},
| ^~~~
CS16Font.cpp:40:10: warning: multi-character character constant [-Wmultichar]
40 | {'ъ', "b"},
| ^~~~
CS16Font.cpp:41:10: warning: multi-character character constant [-Wmultichar]
41 | {'ы', "bI"},
| ^~~~
CS16Font.cpp:42:10: warning: multi-character character constant [-Wmultichar]
42 | {'ь', "b"},
| ^~~~
CS16Font.cpp:43:10: warning: multi-character character constant [-Wmultichar]
43 | {'э', "e"},
| ^~~~
CS16Font.cpp:44:10: warning: multi-character character constant [-Wmultichar]
44 | {'ю', "IO"},
| ^~~~
CS16Font.cpp:45:10: warning: multi-character character constant [-Wmultichar]
45 | {'я', "9"},
| ^~~~
Ответы (2 шт):
Дело в том, что буквы кириллицы, как и любые другие, не являющиеся латиницей, по факту - юникод. Но из-за того, что sizeof(char) == 1, юникод просто не способен хранится в этом типе (исходя из комментариев, можно сказать, что байт имеет право быть как равным по размеру 8 битам, так и нет. Однако такое встречается настолько редко и даже если встретится, то будет иметь специфичную реализацию стандартной библиотеки и компилятора, что этим можно пренебречь). Так что я всё же советую объявить unordered_map<string, string>, а русские буквы писать в двойных кавычках (") для использования юникода. (Также, как писали в ответах выше, есть способ использовать L'..' символы, но нужно будет поменять map<char, string> на map<wchar_t, string>, вдобавок я не уверен, должно ли это работать.)
Используйте wchar_t и wstring:
#include <iostream>
#include <map>
int main() {
setlocale(LC_ALL, "Russian");
std::map <wchar_t, std::wstring> fontDictionary =
{
{L'а', L"А"},
{L'б', L"6"},
{L'в', L"B"},
{L'г', L"G"},
{L'д', L"D"},
{L'е', L"E"},
{L'ё', L"E"},
{L'ж', L"}I{"},
{L'з', L"3"},
{L'и', L"U"},
{L'й', L"u"},
{L'к', L"K"},
{L'л', L"JI"},
{L'м', L"M"},
{L'н', L"H"},
{L'о', L"O"},
{L'п', L"II"},
{L'р', L"P",},
{L'с', L"C"},
{L'т', L"T"},
{L'у', L"y"},
{L'ф', L"o|o"},
{L'х', L"X"},
{L'ц', L"Ul"},
{L'ч', L"4"},
{L'ш', L"W"},
{L'щ', L"W"},
{L'ъ', L"b"},
{L'ы', L"bI"},
{L'ь', L"b"},
{L'э', L"e"},
{L'ю', L"IO"},
{L'я', L"9"},
};
for (int g = 0; auto [i, j]: fontDictionary) {
std::wcout << ++g << L". " << i << L' ' << j << '\n';
}
return 0;
}