Zapis z TexBoxa do char, conversion from 'wchar_t' to 'char', possible loss of data

0

Witam, mam taki problem: Tworzę TextBoxa w którym wpisuję kilka liter z klawiatury. Następnie drugą literę z TextBoxa chcę wpisać do tablicy typu char w następujący sposób:

char litera[10];
litera[0] = TextBox1->Text[1];

Jednak pojawia się błąd:
Warning 1 warning C4244: '=' : conversion from 'wchar_t' to 'char', possible loss of data

W jaki sposób to zrobić aby pozbyć się tego błędu? Kompilator to Microsoft Visual Studio, język C++/CLI

0

używaj wchar_t zamiast char.

0

Zależy mi na tym, aby w tablicy była wartość dziesiętna wpisanego znaku, zgodna z tabelą ASCII. Jak z wchar_t wyciągnąć tą wartość?

0

Normalnie, tak samo.
Dostajesz wartość znaku w Unicode, pierwsze 128 znaków pokrywa się z ASCII.

0

Ok, ale zależy mi jeszcze na tym aby program obsługiwał również polskie znaki, i aby wszystkie te znaki zawierały się w przedziale od 0 do 255. Z tego co znalazłem w pomocach problem dotyczy kodowania. Teraz mam ustawione Codepage 1250, zmiana na kodowanie Codepage 852 nic nie zmienia w działaniu programu. W jaki sposób można to zrobić?

0

Pokaż więcej kodu.

0

Mój program ma za zadanie zamieniać wybrane znaki wpisane przez użytkownika na ciągi binarne (8-bitowe) w taki sposób, aby potem możliwe było odzyskanie ich z tego ciągu (ale to później). Dotyczy to również polskich znaków. Ciąg zapisywany jest do stringa. Robię to w ten sposób:

wchar_t litera[10];
std::string str[10];

litera[0] = TextBox1->Text[1];
str[0]=bitset<8>(litera[0]).to_string<char>();

Moim celem jest, aby w stringu str znalazło się 8 bitów odpowiadających wpisanemu znakowi. Program działa, ale nie obsługuje polskich znaków.

0

Nadal uważam, że najlepiej trzymać się unikodu (a więc std::wstring, bitset<16>, cokolwiek to miałoby robić…), ale jak koniecznie chcesz, to

using namespace System::Text;
...
	wchar_t z = L'ą';
	char c;

	Encoding::GetEncoding(1250)->GetBytes(&z, 1, (unsigned char*)&c, 1);
	// albo 852
0

Niestety nie rozwiązuje to mojego problemu. W obu przypadkach (przy kodowaniu 1250 i 852) w tablicy char znajdują się wartości ujemne. A mi zależy na przedziale 0-255

0

Bo char jest signed.
Rzuć go na unsigned char.

0

A mógłbyś mi jeszcze pomóc, jak zmodyfikować mój kod, aby do tablicy str trafiało te 8 bitów poprawnie? Nie do końca wiem jak to zrobić.

0
				 wchar_t wlitera = textBox1->Text[1];
				 unsigned char litera;
				 Encoding::GetEncoding(1250)->GetBytes(&wlitera, 1, &litera, 1);
				 string str = bitset<8>(litera).to_string<char>();

ale to strasznie drętwy sposób. nadal nie wyjaśniłeś, dlaczego potrzebujesz akurat jeden znak?
przypadkiem nie chcesz przekształcić całego stringa? bo dlaczego robisz tablicę 10 stringów? (std::string str[10];)

czy przypadkiem nie potrzebujesz całego stringa przekształcić na tablicę takich stringów? bo dałoby się to wtedy zrobić znacznie lepiej...

0

Mój program przekształca kilka znaków wybranych przez użytkownika z wpisanego wyrazu. Tworzę tablicę, ponieważ tak jak zauważyłeś nie jest to tylko jeden znak.
W sumie masz rację, przekształcenie wszystkich wpisanych znaków do stringa, a potem tylko odwołanie się do miejsca w tablicy będzie lepszym sposobem.
Udziubałem taki kod:

    for (int i=0;i<TextBox1->Text->Length;i++)
      {
          litera[i] = TextBox1->Text[i];
          str[i]=bitset<8>(litera[i]).to_string<char>();

}

0

Za wczesnie wyslal mi sie post

wchar_t wlitera;
unsigned char litera;

for (int i=0;i<TextBox1->Text->Length;i++)

          {

              wlitera[i] = TextBox1->Text[i];
              Encoding::GetEncoding(1250)->GetBytes(&wlitera, 1, &litera, 1);
              str[i]=bitset<8>(litera[i]).to_string<char>();

          }
0

Źle wpisałem jedną linię, powinna wyglądać tak:

Encoding::GetEncoding(1250)->GetBytes(&wlitera[i], 1, &litera[i], 1); 

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