• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

odczytywanie nazw plików i folderów w inny sposób przez ten sam program/kod

VPS Starter Arubacloud
0 głosów
621 wizyt
pytanie zadane 22 stycznia 2019 w C i C++ przez dawid2002 Mądrala (5,190 p.)

Witam! Mam dość dziwny problem związany z fragmentem kodu w moim programie ,który stworzyłem w visual studio 2017.Miał on za zadanie odczytać nazwy plików i folderów w określonej ścieżce za pomocą funkcji zawartych w bibliotece dirent.h . Nazwy miały być różne np: 123 , żółć , itd. Program odczytywał je dobrze z wyjątkiem tych gdzie były polskie znaki , zamiast nazw były znaki "?". Szukałem długo rozwiązania w tym kawałku kodu ale nie znalazłem. Po pewnym czasie przeniosłem kod do środowiska Code::Blocks gdzie właśnie ten sam kod działał bez problemu.

Nie wiem dlaczego tak to działa. Jeśli ktoś się zna w tym temacie to proszę niech mi powie co mam zrobić żeby ten kod działał w visual studio?

kod:

#include "pch.h"
#include <iostream>
#include <windows.h>
#include <dirent.h>
#include <string>

using namespace std;

DIR* katalog;

struct dirent* pozycja;

string plik;

string PL(const char * text);    // funkcja zamieniająca krzaki na polskie znaki

void detect_folder()
{
	katalog = opendir("ABC"); // katalog w którym będą odczytywane pliki i foldery
	pozycja = 0;

	while (pozycja = readdir(katalog))
	{
		plik = (*pozycja).d_name;

		cout << PL(plik.c_str()) << endl; // wyświetla nazwy plików i folderów
	}

}

int main()
{	
	detect_folder();

	return 0;
}

string PL(const char * text)
{
	string result;
	for (; *text; ++text)
		switch (*text)
		{
		case 'ą': result += static_cast <char>(0xa5); break;
		case 'ć': result += static_cast <char>(0x86); break;
		case 'ę': result += static_cast <char>(0xa9); break;
		case 'ł': result += static_cast <char>(0x88); break;
		case 'ń': result += static_cast <char>(0xe4); break;
		case 'ó': result += static_cast <char>(0xa2); break;
		case 'ś': result += static_cast <char>(0x98); break;
		case 'ż': result += static_cast <char>(0xbe); break;
		case 'ź': result += static_cast <char>(0xab); break;

		case 'Ą': result += static_cast <char>(0xa4); break; //(0xa4) // dla duzej litery
		case 'Ć': result += static_cast <char>(0x8f); break; //(0x8f)
		case 'Ę': result += static_cast <char>(0xa8); break; //(0xa8)
		case 'Ł': result += static_cast <char>(0x9d); break; //(0x9d)
		case 'Ń': result += static_cast <char>(0xe3); break; //(0xe3)
		case 'Ó': result += static_cast <char>(0xe0); break; //(0xe0)
		case 'Ś': result += static_cast <char>(0x97); break; //(0x97)
		case 'Ż': result += static_cast <char>(0xbd); break; //(0xbd)
		case 'Ź': result += static_cast <char>(0x8d); break; //(0x8d)
		default: result += *text; break;
		}

	return result;
}

 

rezultat działania programu napisanego w visual studio:

rezultat działania programu w Code::Blocks:

Z góry dziękuje za pomoc!!!

komentarz 23 stycznia 2019 przez j23 Mędrzec (194,920 p.)

Sprawdzałeś (w debuggerze), co zawiera pole d_name dla nazw z literami diakrytycznymi?

komentarz 23 stycznia 2019 przez dawid2002 Mądrala (5,190 p.)
Nie. Jak mogłbym to sprawdzić?

1 odpowiedź

0 głosów
odpowiedź 10 marca 2019 przez sneik555 Nowicjusz (140 p.)
Sprawdź co masz ustawione w 'encoding' w Visual Studio. Podejrzewam, że w Code::Blocks jest z automatu ustawione na UTF-8 co pozwala na nie gubienie znaków specjalnych.
komentarz 16 marca 2019 przez dawid2002 Mądrala (5,190 p.)
w Visual studio  mam kodowanie: Unicode - strona stronicowania 1200.

A w code::blocks mam windows 1250.

To znaczy że mam ustawić w Visual Studio kodowanie na windows 1250 ?

Podobne pytania

0 głosów
1 odpowiedź 222 wizyt
pytanie zadane 26 marca 2019 w C i C++ przez xFanti Obywatel (1,350 p.)
0 głosów
4 odpowiedzi 434 wizyt
0 głosów
2 odpowiedzi 476 wizyt
pytanie zadane 25 stycznia 2019 w C i C++ przez dawid2002 Mądrala (5,190 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...