Проблема с работой с текстовым файлом utf-8 c ++ - PullRequest
1 голос
/ 13 января 2020

В последнее время я сталкиваюсь с проблемой при попытке получить строку из файла в формате utf-8 (?). Мне также нужно скопировать эту строку в буфер обмена и иметь возможность вставить ее в файл .txt.

#include <iostream>
#include <windows.h>
#include <cstdio>
#include <conio.h>
#include <time.h>
#include <string>
#include <fstream>
#include <wchar.h>
using namespace std;
wstring lastLine;



void mesparse()
{
    wifstream client("Client.txt");
    if(client.is_open())
    {
        client.seekg(-7,ios_base::end);
        int kloop=0;
        while (kloop<1)
        {
            wchar_t ch;
            client.get(ch);


            if(ch == '\n') {                    
                kloop=1;                                
            }
            else {                                  
                client.seekg(-4,ios_base::cur);         
            }}            
        getline(client,lastLine);  


        client.close();
    }
    else
    {
        cout<<"Unable to open client.txt file.";
    }
}
void toClipboard(std::wstring s){
    const wchar_t* text = s.c_str();
int len = wcslen(text);

HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, (len + 1) * sizeof(wchar_t));
wchar_t* buffer = (wchar_t*)GlobalLock(hMem);
wcscpy_s(buffer, len + 1, text);
GlobalUnlock(hMem);

OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_UNICODETEXT, hMem);
CloseClipboard();
}

int main()
{

mesparse();
toClipboard(lastLine);
wcout<<lastLine<<endl;

}

Что я пытаюсь скопировать:

йцукaеёśнгшщㅂхфывапрㅊджэячсмитъбюㅗ
йцукaеёśнгшщㅂхфывапрㅊджэя
йцукaеёśнгшщㅂхфывапрㅊ
йцукaеёśнгшщㅂхфыва

Ответы [ 2 ]

3 голосов
/ 13 января 2020

CF_UNICODETEXT! = UTF-8.

Первый - это широкие символы, второй - 8-битный.

Сначала необходимо преобразовать его с MultiByteToWideChar().

* 1007. * Поэтому прочитайте весь текст до std::string, а не до std::wstring. Затем получите std::wstring с MultiByteToWideChar() и , затем скопируйте его в буфер обмена.

Кроме того, поиск символов в тексте UTF-8 обычно является плохой идеей (кодировка переменной).

1 голос
/ 14 января 2020

Это пример кода решения, указанного @Michael Chourdakis.

string mesparse()
{
    string lastLine = "";

    ifstream client("Client.txt");
    if (client.is_open())
    {
        client.seekg(-7, ios_base::end);
        int kloop = 0;
        while (kloop < 1)
        {
            char ch;
            client.get(ch);


            if (ch == '\n') {
                kloop = 1;
            }
            else {
                client.seekg(-4, ios_base::cur);
            }
        }
        getline(client, lastLine);


        client.close();
    }
    else
    {
        cout << "Unable to open client.txt file.";
    }

    return lastLine;
}

void toClipboard(std::string s) {

    int len;
    // Retrieve the length
    len = MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, s.c_str(), -1, NULL, 0);

    HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, (len) * sizeof(wchar_t));
    wchar_t* buffer = (wchar_t*)GlobalLock(hMem);

    // Convert to wide char string
    len = MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, s.c_str(), -1, buffer, len);
    GlobalUnlock(hMem);

    wcout << buffer << endl;

    OpenClipboard(NULL);
    EmptyClipboard();
    SetClipboardData(CF_UNICODETEXT, hMem);
    CloseClipboard();
}

int main()
{
    string copiedStr = mesparse();
    if (copiedStr.length() == 0)
        return 0;

    toClipboard(copiedStr);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...