Форум программистов, компьютерный форум CyberForum.ru

Некоректное считывание кириллических символов - C++

Восстановить пароль Регистрация
 
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
11.07.2015, 16:18     Некоректное считывание кириллических символов #1
Здравствуйте.
Вот в такой функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
std::vector<std::string> CreateFileList(std::string p, std::vector<std::string>& Directories)
{
    std::vector<std::string> Files(0);
    std::string variable = p +'\0'; 
    wchar_t* Buffer = new wchar_t[p.length() + 1 ];
    mbstowcs(Buffer, variable.c_str(), variable.length()); 
    cout << p.length() << endl;
    Directories.emplace_back(p); // занесение введенного пользователем пути в массив-     
    wcsncat(Buffer, L"\\*.*", wcslen(L"\\*.*"));
    WIN32_FIND_DATAW FindFileData; 
    HANDLE hf;
    wcout << Buffer << endl;
    hf = FindFirstFileW(Buffer, &FindFileData); 
    if (hf == INVALID_HANDLE_VALUE)
    {       cout << "Invalid_handle_val \n" << endl;
        cout << "What to do?" << endl;      }
    do
    {   wstring ws(FindFileData.cFileName); // переменная имени файла в двух форматах 
        std::string temp(ws.begin(), ws.end());
        if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если находим дирректорию 
        {   std::wcout << " Here is the folder: %s  \n" << FindFileData.cFileName << endl; 
            Directories.emplace_back(p +"\\" +temp); }
        else
        {   Files.emplace_back(p +"\\" + temp); }} 
    while (FindNextFile(hf, &FindFileData) != NULL); // ищем следующий файл 
    return Files;
}
При установке проекта в : Use Unicode Character Set.

Имя файла на кириллице отображается некорректно.
Почему? Что делать?
Миниатюры
Некоректное считывание кириллических символов  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2015, 16:18     Некоректное считывание кириллических символов
Посмотрите здесь:

C++ Последовательное считывание массива символов
Считывание символов с файла. C++
Считывание символов из строки C++
C++ Считывание символов с файла
Отображение кириллических символов из файла C++
C++ Подсчитать, сколько было введено: латинских прописных букв, кириллических прописных букв, цифр, знаков переноса, прочих символов.
Считывание символов и цифр с клавиатуры C++
C++ Непонятка с кодами кириллических символов

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
11.07.2015, 18:08     Некоректное считывание кириллических символов #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от VoltDeMar Посмотреть сообщение
Почему? Что делать?
Не использовать однобайтовые кодировки вообще. Использовать юникод везде. Никаких конвертаций.

Вот, причесал твой код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <vector>
#include <string>
#include <windows.h>
#include <fcntl.h>
#include <io.h>
 
std::vector<std::wstring> CreateFileList(std::wstring const & path, std::vector<std::wstring> & Directories)
{
    std::vector<std::wstring> Files;
 
    Directories.emplace_back(path); // занесение введенного пользователем пути в массив-     
 
    std::wstring const searchMask = path + L"\\*.*";
    std::wcout << searchMask << std::endl;
    
    WIN32_FIND_DATA FindFileData;
 
    HANDLE hf = FindFirstFile(searchMask.c_str(), &FindFileData);
    if (hf != INVALID_HANDLE_VALUE)
    {
        do
        {
            if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если находим дирректорию 
            {
                std::wcout << " Here is the folder: [" << FindFileData.cFileName << "]" << std::endl;
                Directories.emplace_back(path + L"\\" + FindFileData.cFileName);
            }
            else
            {
                std::wcout << " Here is the file: [" << FindFileData.cFileName << "]" << std::endl;
                Files.emplace_back(path + L"\\" + FindFileData.cFileName);
            }
        } 
        while (FindNextFile(hf, &FindFileData) != NULL); // ищем следующий файл 
    }
    else
    {
        std::wcout << L"Invalid_handle_val" << std::endl;
        std::wcout << L"What to do?" << std::endl;
    }
    return Files;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    _setmode(_fileno(stdin), _O_U16TEXT);
    _setmode(_fileno(stdout), _O_U16TEXT);
 
    std::wstring path;
    if (std::getline(std::wcin, path))
    {
        std::vector<std::wstring> Directories; // вектор с директориями
        std::vector<std::wstring> Files = CreateFileList(path, Directories); // вектор с файлами
    }
    return 0;
}
Yandex
Объявления
11.07.2015, 18:08     Некоректное считывание кириллических символов
Ответ Создать тему
Опции темы

Текущее время: 01:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru