Miért van az, hogy C++-ban stringekkel működnek az ékezetes karakterek, char típusú változókkal meg nem?
Ez így műküdik és az a[0] char típus (nem pedig mondjuk wchar_t), aminek az értéke nálam -61:
#include <iostream>
#include <typeinfo>
int main() {
std::string a = "á";
std::cout << a << '\n';
std::cout << static_cast<int>(a[0]) << '\n';
std::cout << typeid(a[0]).name() << '\n';
}
Ez viszont nem működik, és itt intként kiíratva nálam -95:
#include <iostream>
int main() {
char a = 'á';
std::cout << a << '\n';
std::cout << static_cast<int>(a) << '\n';
}
Miért van az, hogy a felső példában -61, az alsóban meg -95 az á karakter kódja?
A char csak 8 bit, és valami ökörséget csinál amikor az a á betűt pakolod bele.
A másik viszont utf-8 lesz.
Megnéztem, c3a1 az utf-8 hexakódja a á betűnek.
Ha úgy paszírozom be 8 bitbe, hogy a c3-at levágom, ki is jön a -95(a1 hex).
A -61 nem tudom hogy jött össze.
Az a te bajod, hogy a[0] elemet kasztolod intté, meg íratod ki.
A string operator[] egy bájtot ad vissza, vagyis az első bájtját a sztringnek, de az á betű az két bájtos (ha nagyon egyben akarod kezelni, akkor lehet a[0]<<8 | a[1] az int értéke, ez már két felhasznált bájt a 4 bájtos intből. Kis varázslás, de így sem biztos, hogy az történik majd, amit te akarsz.).
Ha chart akarsz belőle, van a sztring osztálynak c_str függvénye, ami char alapú nullterminált karakterláncot ad vissza, szerintem az kell neked.
Akkor már így csinálnám, de így meg kérdőjel íródik ki a karakter helyett.
#include <iostream>
#include <typeinfo>
int main() {
std::wstring a = L"á";
std::wcout << a << '\n';
std::wcout << static_cast<int>(a[0]) << '\n';
std::wcout << typeid(a[0]).name() << '\n';
}
Mert a konzol nem ismeri ezt az ékezetet.
setlocale(LC_ALL, "hun");
és a konzolban meg olyan betűtípus kell, amit támogat
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!