Kodowanie polskich znaków

0

Witam, mam najzwyklejszy plik .txt a w nim ciąg znaków typu: ąężźćóóóóółłłł, jak mogę poprwanie wyświetlić to w konsoli oraz jak mogę zamienić to na UTF32 w formie tablicy intów? Ponieważ funckja w bibliotece graficznej przyjmuje właśnie taką tablicę aby wyświetlić coś co jest w Unicodzie.

Jakakolwiek pomoc będzie przydatna

Na razie próbowałem to zapisać w Notatniku z kodowaniem Unicode i odczytać za pomocą funkcji z przedrostkiem w czyli np wstring ale to nic nie daje

0

W ten sposób nie zadziała tym bardziej jak będziesz chciał odwoływać się do pojedynczych znaków. Jest jakaś biblioteka dla c++ specjalnie przeznaczona do tego celu ale nie pamiętam jej nazwy. Poszukaj w google.
Uważam, że niegłupim rozw. jest również samemu napisanie funkcji tłumaczącej (przydadzą się operatory bitowe &, <<, | ).
przydatny opis: http://en.wikipedia.org/wiki/UTF-8#Description
tu nawet ktoś napisał coś takiego ale nie trzeba pisać aż tyle: http://www.cplusplus.com/forum/general/31270/
Do przechowania znaku używaj wchar_t, do łańcucha wstring czyli tak jak robiłeś, do wypisania tekstu wcout.
edit:
na pewno nie jest to jedyne rozw. ale napisałem sposób jaki dla mnie działa niezawodnie
edt2:
jeśli plik byłby zapisany w cp1250 (czasem nazywane ansi), to inna przydatna rzecz:
http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT

0

Dzięki, skorzystam na pewno z pierwszego linku. Więc wystarczy że zapisze plik jako UTF8, odczytuje linijki do stringa i potem używam funkcji FromUTF8?

0

Jeśli chodzi o tę funkcję, to nie musi być akurat string (string.c_str()), może być to np tablica char jeśli plik byłby duży. Funkcja nie musi też zwracać akurat wstring a np tablicę typu wchar_t i też powinno być ok.

0
std::string tempor1;
	std::wstring tempor;
	 std::ifstream plik("test.txt");
	 if (!plik) std::cout << "Nie udalo sie otworzyc pliku z zablokowanymi uzytkownikami" << std::endl;
	else
		std::getline(plik,tempor1);
	plik.close();
	tempor = FromUTF8(tempor1.c_str());
	std::wcout << tempor << std::endl;

I nic się nie wyświetla, plik jest zapisany jako UTF8.

0

Trudno powiedzieć co jest nie tak, należałoby odpalić debuger i prześledzić co tam się dzieje.
Dodam tylko, że jeśli masz jakiś większy plik lepiej jest wczytać go do tablicy i na niej operować. Działa to dużo szybciej. Tu przykład:
http://www.cplusplus.com/reference/iostream/istream/read/

0

Nie no, na razie to nie będą duże pliki ponieważ chcę na razie spróbować to w ogóle zastosować i wyświetlić.

0

Przeleciałem debuggerem, wszystko robi się pięknie, pięknie aż tu nagle przy ostatnim obrocie pętli jakoś magicznie cały utworzony string który ma być zwrócony nagle jest czyszczony

0

Szkoda, że nie mogę w żaden sposób edytować posta więc proszę moderatora o sklejenie moich wypowiedzi. String jednak jest tworzony ponieważ jego długość jest poprawna natomiast nie mogę go wyświetlić w konsoli i nie wiem dlaczego.

0

Czyli łańcuch powstaje, widać w podglądzie polskie znaki diakrytyczne itd.
A jak napiszesz np:

std::wcout << L"ąęć" << std::endl;

to wyświetla się coś?

0

Nie, nie wyświetla się nic.

0

Możliwe, że wcześniej przed wywołaniem wcout użyłeś gdzieś cout. Nie używaj w ogóle cout i zobacz czy coś to zmienia (u mnie przynajmniej. zmienia). Generalnie nie wiem na czym ten błąd polega ale pewnie można to jakoś obejść.

0

cout nigdzie nie ma.
Fikuśny przpyadek

0

Dobra, w sumie nie potrzebne mi jest wyświetlanie tego w konsoli, potrzebuję to zamienić teraz na UTF32 i potem na tablicę intów odpowiadającą znakom w UTF32

0

format UTF8 jest opisany na wiki:
http://en.wikipedia.org/wiki/UTF-8#Description

gdzie "binary code point" to wartość twojego inta.

pamiętaj że na początku pliku może występować sekwencja BOM, czyli trzy bajty EF BB BF, po zdekodowaniu dające znak U+FEFF. Można go traktować jako znacznik że plik jest zakodowany w UTF-8. Przy wczytywaniu należy go pominąć (usunąć) a przy zapisie do pliku można dodać (nie trzeba).

0

No właśnie zauważyłem, że przy odczycie pliku w stringu dodaje mi jakiś fikuśny znak. A to że muszę zamienić na UTF32 i potem an tablicę intów dowiedziałem się od Developera tej biblioteki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1