Как прочитать символы Unicode (не-Engli sh языки) из файла, чтобы я мог отказаться от ругательств [C ++]? - PullRequest
1 голос
/ 12 апреля 2020

Цель: Android / iOS приложение, которое отображает непростые слова, когда пользователь вводит букву.

Код работает правильно, за исключением не-Engli sh символов. Программа допускает некоторые нецензурные sh проклятия, когда пользователь вводит свое имя.

  • Ожидаемый результат: Программа отклонит все слова проклятия (в пределах nameCurseWordsList.txt)

  • Фактический результат: пропущены некоторые нецензурные слова sh.

  • Сообщения об ошибках: Нет

Попытка:

  1. Изменение ввода вектора и связанной переменной userFirstName на wstring.
  2. Проверяется, установлены ли для параметров VS2019 значение "Автоопределение кодировки UTF-8". без подписи "- уже включено.
  3. Изменена кодировка nameCurseWordsList.txt с" UTF-8 с спецификацией "на" UTF-8 ".
  4. Установите окно вывода cmd в VS2019 для использования шрифта Lucida Консоль.
  5. Как обрабатывать последовательности символов Юникода в C / C ++?
  6. Как моя программа может переключаться с ASCII на Unicode?
  7. Как отображать символы Юникода в Visual Studio?

Co de:

// Description: Android/iOS application that takes in a letter and displays tricky-to-spell words.

#include <iostream>
#include <fstream>
#include <locale>
#include <string>
#include <vector>
#include <limits>
#include <sstream>
#include "usingDeclarations.hpp"

vector <string> trickyWordsVector;
vector <wstring> nameCurseWordsVector;
void printWords(char userLetterInput);
void getTrickyWords();
void getNameCurseWords();

int main() {    
    cout << "----------------<>-----------\n";
    cout << "Welcome to Your TRICKY WORDS Helper!\n";
    cout << "----------------<>-----------\n";

    wstring userFirstName;
    size_t firstNameOnlyAlpha{};
    bool isNameCurseWord = false;

    do {
        cout << "\nEnter your first name: ";
        getline(wcin, userFirstName);
        for (unsigned __int8 i = 1; i < userFirstName.length(); i++) {
            if (userFirstName[i - 1] == ' ') {
                userFirstName[i] = toupper(userFirstName[i]);
            } else {
                userFirstName[i] = tolower(userFirstName[i]);
            }
        }
        userFirstName[0] = toupper(userFirstName[0]);
        firstNameOnlyAlpha = userFirstName.find_first_of(L"0123456789`~!@#$%^&*()':'';''/'-_=+{}[]|:<>,.' '?'\t\"");

        getNameCurseWords();

        if (find(nameCurseWordsVector.begin(), nameCurseWordsVector.end(), userFirstName) != nameCurseWordsVector.end()) {
            cout << "Curse word entered. Please freakin' try again.\n";
            isNameCurseWord = true; 
        }   else {
            isNameCurseWord = false;
        }
    } while (isNameCurseWord || firstNameOnlyAlpha != string::npos || userFirstName.empty());

    char userLetterInput; 
    char userChoiceContinue;

    do {
        do {
        cout << "\nEnter a letter [a-z]: ";
        cin >> userLetterInput;
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        userLetterInput = toupper(userLetterInput);

        if (isalpha(userLetterInput)) {
            wcout << "\nHey " << userFirstName << ",\n\nHere's your list of tricky words for the letter (" << char(toupper(userLetterInput)) << "):\n" << endl;
            }
        } while (!isalpha(userLetterInput));

        getTrickyWords();

        printWords(userLetterInput);

        do {
            cout << "\nWould you like to enter another letter [y,n]?: ";
            cin >> userChoiceContinue;
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        } while (char(tolower(userChoiceContinue)) != 'y' && char(tolower(userChoiceContinue)) != 'n');
    } while (char(tolower(userChoiceContinue)) == 'y');

    cout << "\n----------------<>-----------\n";
    cout << "Thank you for using Your TRICKY WORDS Helper!\n";
    cout << "\n----------------<>-----------\n";

    return 0;
} // end main()

void printWords(char userLetterInput) {
    for (int i = 0; i < trickyWordsVector.size(); i++) {
        if (trickyWordsVector[i][0] == userLetterInput) {
            cout << trickyWordsVector[i];
            cout << "\n";
        }
    }
} // end printWords()

void getTrickyWords() {
    ifstream trickyWordsFile("trickyWordsList.txt");

    if (trickyWordsFile.is_open()) {
        if (trickyWordsVector.empty()) {
            string line;
            while (getline(trickyWordsFile, line)) {
                if (line.size() > 0) {
                    trickyWordsVector.push_back(line);
                }
            }
        }
    }
    else {
        cerr << "Cannot open the file.";
    }

    trickyWordsFile.close();

} // end getTrickyWords()

void getNameCurseWords() {
    wifstream nameCurseWordsFile("nameCurseWordsList.txt");

    if (nameCurseWordsFile.is_open()) {
        if (nameCurseWordsVector.empty()) {  
            wstring line;
            while (getline(nameCurseWordsFile, line)) {
                if (line.size() > 0) {
                    nameCurseWordsVector.push_back(line);
                }
            }
        }
    }
    else {
        cerr << "Cannot open the file, you sailor mouth. ;)";
    }

    nameCurseWordsFile.close();

} // end getNameCurseWords()

usingDeclarations.hpp

#pragma once

using std::cout;
using std::wcout;
using std::cin;
using std::wcin;
using std::cerr;

using std::getline;
using std::endl;
using std::use_facet;

using std::numeric_limits;
using std::streamsize;
using std::string;
using std::wstring;
using std::ifstream;
using std::wifstream;
using std::vector;
using std::locale;
using std::ctype;

trickyWordsList.txt или trickyWordsFile

Argument 
Atheist 
Axle 
Bellwether 
Broccoli 
Bureau 
Caribbean 
Calendar
Camaraderie 
Desiccate 
Desperate 
Deterrence

nameCurseWordsList.txt или nameCurseWordsFile (частичный список)

// Irish
RáIcleach
// German
ScheißKopf
// Russian
Oбосра́ться
Obosrat'sya
// Chinese
王八蛋
Hùn Zhàng
// Japanese
くそ 
// Korean
아, 씨발 

Спасибо за любые советы.

Запустите код, используя https://repl.it/~

...