Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Zmiana długości string i polskie znaki


Rekomendowane odpowiedzi

Opublikowano

Witam, mam funkcję, która ma dostosować napis do podanej długości, wygląda tak:

string Generator::Adjust(string napis, int length)
{
	for(int i = 0; (int)napis.length() < length; i++)
	{
		napis += napis[i];
	}
	if((int)napis.length() > length)
	{
		napis = napis.substr(0, length);
	}
	return napis;
}

Funkcja ma dostosować długość jednego napisu do drugiego, jeżeli napis jest krótszy to funkcja ma dodawać na jego koniec kolejne znaki z jego początku. Jeżeli jest dłuższy to ma go odpowiednio skrócić, tylko tutaj jest problem bo nie wiem dlaczego otrzymuję o kilka znaków dłuższy napis.

 

Funkcję wywołuję tak:

	int napisB_len = napisB.length();
	napis_A = Adjust(napis_A, napisB_len);

Pomocy, dodam, że wcześniej jakimś cudem wszystko działało jak należy nie wiem czy zmieniłem coś przypadkowo w kodzie.

 

@Edit Nie wiem co jest grane. Okazuje się, że funkcja działa nieprawidłowo (również pierwsza część) tylko, gdy trzeba dopasować długość napisu do długości napisu pobranego z sieci za pomocą curl. Dlaczego tak się dzieje? Jak później wyświetlam napisy w messagebox to mają różną ilość znaków.

 

@Edit Nie rozumiem wyraz ma 16 znaków, nie zawiera, żadnych białych znaków typu spacja itp., a instrukcja napis.length() zwraca 19, napis.size() tak samo.

giphy.gif

Opublikowano
std::string Generator::Adjust(const std::string &text, const int &length)
{
    std::string toReturn;

    int len = length;

    for (size_t i = 0; i < len; ++i)
    {
        if (i >= text.length())
        {
            len -= text.length();
            i = 0;
        }
        else
        {
            toReturn += text[i];
        }
    }

    return toReturn;
}

Edit:

 

Przykład:

std::string result = Adjust("test", 4);
std::string result2 = Adjust("test", 2);
std::string result3 = Adjust("test", 6);

std::cout << result << std::endl;
std::cout << result2 << std::endl;
std::cout << result3 << std::endl;

Taki jest output:

test
te
testte
Opublikowano

@skprime Dzięki, problem jest jednak gdzie indziej. Jeszcze przed wywołaniem funkcji, napis.length() zwraca większą liczbę znaków niż faktycznie jest w stringu.

giphy.gif

Opublikowano

Jakiego kompilatora używasz?

 

Edit:

 

A napis.size() co Ci daję?

Opublikowano

@skprime VS 2012, size tak samo.

giphy.gif

Opublikowano

Pokaż mi CAŁY kod, bo trudno mi uwierzyć.. Mi wszystko działa jak należy. :)

Opublikowano

@skprime Mi też działa jak przypiszę w programie do zmiennej string jakąś wartość, ale zmienna przyjmuje wartość pobraną z mojego lokalnego serwera.

Wygląda to tak:

bool Contact::GetValue(string argument1)
{
	curl_global_init( CURL_GLOBAL_ALL );
	CURL *curl = curl_easy_init();

	curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0");
	curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1 );
	curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1 );

	string response;
	if (curl) 
	{
		curl_easy_setopt( curl, CURLOPT_URL, "http://localhost/main/generator.php" );
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CURLcode_To_UTF8);
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
		string requestData = "a=";
		requestData.append(argument1);
		const char *data = requestData.c_str();
		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
		curl_easy_perform(curl);
		curl_easy_cleanup(curl);
	}
        // przykładowo response będzie miało wartość "01101001" czyli 8 znaków, a MsgBox poniżej wyświetli 11, zmienna nie zawiera żadnych spacji itp.
	MessageBox(NULL, UTF8_TO_UTF16(intToString(response.length()).c_str(), (LPCWSTR)L"Title", MB_ICONINFORMATION | MB_OK);

        return false;
}

size_t Contact::CURLcode_To_UTF8(void *ptr, size_t size, size_t count, void *stream) 
{
	((string*)stream)->append((char*)ptr, 0, size*count);
	return size*count;
}

giphy.gif

Opublikowano

Czyli problem leży w kodzie wyżej.

A jak zrobisz:

std::cout << response.length() << std::endl;

Też wyświetla się nie poprawna wartość? Trzeba sprawdzić co jest źle, wykluczyć wszystko co działa i dojść do błędu.

Może konwersja intToString wypada nie poprawnie? Sprawdź cout'em od razu po nadaniu zmiennej wartości, bez konwersji do stringa, i.t.d..

Opublikowano

Mam w programie drugą funkcję niemal identyczną, która działa w ten sam sposób jedynie odwołuje się do innego skryptu PHP i nie ma takiego błędu, więc problem chyba leży w skrypcie na serwerze. Chociaż to i tak nieco dziwne bo widoczne jest 7 znaków więcej nic nie ma bo skrypt tyle zwraca przez echo, a program tą wartość otrzymuje i poprawnie wyświetla tak jakby ta wartość otrzymana z serwera miała jakieś niewidoczne bajty tylko skąd.

 

@Edit Ok, udało się znaleźć przyczynę. :D Kodowanie pliku PHP miało znaczenie. Po konwersji kodowania w Notepad++ z UTF-8 na UTF-8 bez BOM. Wszystko działa jak powinno. @skprime Dzięki za pomoc! :)

 

@Edit Jednak nie wszystko :(. Co prawda napis.length() zwraca już prawidłową wartość ale kiedy zmienna przyjmuje wartość np. std::string napis = "okay" to instrukcja:

if(napis == "okay")
{
//...
}

nie wykonuje się.

 

@Edit Po zamianie string na hex okazało się, że napis pobrany z serwera = 5355434345535300, a lokalny 53554343455353. Czyli dwa zera na końcu. Jak się ich pozbywać? Na razie zamieniam tekst na hex, ucinam zera na końcu i zamieniam z hex na tekst. Może da się pozbyć tych zer jakoś w "zarodku"? Tylko skąd one się biorą? 

giphy.gif

Opublikowano

A std::string(napis).c_str(); zwraca to samo?

Może przepuścić to przez stringstream, a potem wyciągnąć?

 

Szczerze to trudno mi powiedziec co powoduje ten problem, po prostu nie miałem z czymś takim doczynienia. :)

Opublikowano

@1373230489-U611928.pngVereX. Chyba nie potrafię korzystać z debuggera bo nie wiem w jaki sposób pomógłby mi rozwiązać ten problem. :<

 

Mam jeszcze inny problem. Mam std::string requestData z polskimi znakami, następnie robię:

const char *data = requestData.c_str();

I chyba przez to jest problem z polskimi znakami. Jak to naprawić? W Notepad++ mam "xBF" zamiast polskiej literki. Jak zmienię kodowanie na ANSI i zrobię konwersję na UTF-8 to pojawiają się.

giphy.gif

Opublikowano

Jak to w Notepad++ masz "krzaczki"?

Otwierasz nim kod, czy jakiś plik wygenerowany przez ten program?

Przecież mówisz, że polskie znaki masz w stringu, a w Notepad++ masz "krzaczki"? :D

Może źle zrozumiałem coś, może masz nazwy zmiennych/funkcji/metod/klas polskimi znakami zrobione? Co mam przez to rozumieć? :D

Opublikowano

@skprime Nie, chodzi o to, że w programie do zmiennej string requestData wprowadzam polskie znaki np. "łąć", później:

const char *data = requestData.c_str();

I wykonuję zapytanie metodą POST do pliku PHP, który otrzymaną wartość zapisuje do pliku.html. Gdy otwieram ten plik.html w przeglądarce mam jakiś krzaczek zamiast np. "ż", a w Notepad++ "xBF" czyli postać heksadecymalna. Jak w pliku php do zmiennej przypiszę bezpośrednio polskie znaki to wszystko jest OK. Więc chyba ta konwersja do char* coś zmienia. A może wcale nie powinienem używać stringów?

giphy.gif

Opublikowano

Trudno mi powiedzieć, nigdy nie używałem polskich znaków w swoich programach, dlatego trudno mi coś doradzić. Może spróbuj wstringa? A może problem tkwi przy "postowaniu" do pliku PHP? Najlepiej potestuj pojedyńcze elementy "manualnie" i sprawdź który element może być przyczyną. :)

Opublikowano

@Pancake czyli libcurl nie pozwoli mi wysłać polskich liter na serwer? Bo jako argument przyjmuje char*. Czy może w php będę mógł to jakoś złożyć, bo tak jak napisałem, kiedy ustawię kodowanie w notepad++ na ANSI, a następnie zrobię konwersje na UTF-8 to pojawiają się polskie znaki.

giphy.gif

Opublikowano

Użyłem jednak funkcji PHP, teraz znaki wyświetlają się poprawnie. :)

	$data = iconv(mb_detect_encoding($data),"UTF-8",$data);

giphy.gif

Opublikowano

Jednak jest problem z tym rozwiązaniem :(, dotyczy to  liter ó oraz ę - szczególnie kiedy występują pod rząd.

Problem leży w tej funkcji:

string Encrypt::String_To_BinaryString(string textString)
{
	string binaryString;
	for(size_t i = 0;i < textString.size(); ++i)
	{
		binaryString += bitset<8>(textString[i]).to_string();
	}
	return binaryString;
} 

Kiedy zamiast użycia powyższej funkcji podstawiam do programu postać binarną z tego konwertera:

http://online-toolz.com/tools/text-binary-convertor.php 

to wszystko działa jak powinno nawet bez użycia iconv w pliku PHP. W jaki sposób zamienić tekst na ciąg binarny, żeby otrzymać wynik jak na tym konwerterze online?

giphy.gif

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...