Как можно использовать русские символы из файла в качестве ключей для unordered_map?

Как я могу адаптировать программу под работу с файлами, содержащими символы не только из английского алфавита, но и из других языков, таких как русский и монгольский?
  • 19 февраля 2024 г. 13:08
Ответы на вопрос 3
Для использования русских символов из файла в качестве ключей для `unordered_map` вам необходимо убедиться, что файл корректно считывается и преобразуется в строку с учетом кодировки. Большинство стандартных функций в C++ могут работать с Unicode, поэтому вам нужно только правильно указать кодировку при чтении файла.

Пример кода для использования русских символов в `unordered_map`:

```cpp
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <string>

int main() {
    std::ifstream file("input.txt");
    if (!file.is_open()) {
        std::cerr << "Error opening file." << std::endl;
        return 1;
    }

    std::unordered_map<std::string, int> map;
    std::string key;
    int value;

    while (file >> key >> value) {
        map[key] = value;
    }

    file.close();

    // Используем русский символ в качестве ключа
    map["Привет"] = 42;

    for (const auto& pair : map) {
        std::cout << pair.first << " : " << pair.second << std::endl;
    }

    return 0;
}
```

Чтобы адаптировать программу под работу с файлами, содержащими символы не только из английского алфавита, вам нужно использовать строковые типы данных (`std::string`) для ключей в `unordered_map`, так как они позволяют хранить символы различных языков. Убедитесь, что ваш текстовый файл сохранен в правильной кодировке (например, UTF-8) и используйте функции ввода-вывода в C++, которые поддерживают Unicode.
Попробуй указать локаль - setlocale(LC_ALL, "Russian");
Используйте std::wstring в качестве ключа. 
https://godbolt.org/z/sfTq4nPhj

#include <iostream>
#include <unordered_map>
#include <cwchar>

int main() {
    // Define a wide character string
    std::wstring key1 = L"бла_бла";
    std::unordered_map<std::wstring, int> mp;
    
    mp[L"бла_бла"] = 42;
    std::cout << mp[key1];

    return 0;
}


Для вывода в консоль установите локаль + либу, чтобы нормально итерироваться по строке. Например, вот либа для UTF-8 https://github.com/nemtrif/utfcpp
Похожие вопросы