McAffey Temat założony przez niniejszego użytkownika |
Zawartość stringa przechowującego polski znak - ujemny char » 2013-12-30 14:59:48 Witajcie. Próbuję rozwikłać jedną rzecz. Jak wiadomo typ char przechowuje wartości liczbowe od 0 do 255. Dlaczego więc, gdy zapiszę w pliku zakodowanym w ANSI znak "Ą" po czym go pobiorę do stringa, to string zawiera dokładnie jeden znak (długość stringa wynosi 1) a rzutowanie tego znaku na inta przekazuje wartość -91. Dlaczego -91 skoro char powinien przechowywać wartości unsigned ? A gdy zakoduję w UTF-8 i go pobiorę do stringa (albo gdy zapiszę po prostu jako stałą dosłowną, bo edytor w IDE mam też kodowany jako UTF-8) to string przechowuje dwa znaki (długość stringa wynosi 2) i te znaki rzutowane na int, przekazują wartości odpowiednio : -60 i -124 (dla znaku "Ą"). Te same pytanie, jak char dopuszcza znaki ujemne ? |
|
SeaMonster131 |
» 2013-12-30 15:10:56 |
|
McAffey Temat założony przez niniejszego użytkownika |
» 2013-12-30 15:15:58 Dzięki, a wydawało mi się że każdy jest unsigned, jeszcze w dodatku na szybko sprawdziłem w google jednak na stronie na której było błędne info http://4programmers.net/C/Char. Edit : a dlaczego są wartości -60 i -124 (dla "Ą") gdy "Ą" w Unicode to dziesiętnie Ą a szesnastkowo Ą ? Jak to odnieść ? |
|
Elaine |
» 2013-12-30 15:30:09 a dlaczego są wartości -60 i -124 (dla "Ą") gdy "Ą" w Unicode to dziesiętnie Ą a szesnastkowo Ą ? Jak to odnieść ? |
W UTF-8 0xC4 0x84 to U+0104 LATIN CAPITAL LETTER A WITH OGONEK. |
|
McAffey Temat założony przez niniejszego użytkownika |
» 2013-12-30 15:50:16 |
|
pekfos |
» 2013-12-30 16:36:34 0xC4 i 0x84. No i jak to odnieść do "-60 i -124 | 0xC4 typu char, to -60. |
|
Elaine |
» 2013-12-30 19:20:12 nie rozumiem, to 0xC4 czy 0x84 ? Czy są dwie reprezentacje "Ą" ? |
Nie, jest jedna, dwa bajty: 0xC4 0x84. W UTF-8 każdy znak zapisywany jest na od jednym do czterch bajtów: Znaki od U+0000 do U+007F zapisywane są na jednym bajcie, np.: U+0061 LATIN SMALL LETTER A to 0x61Znaki od U+0080 do U+07FF zapisywane są na dwóch bajtach, np.: U+0419 CYRILLIC CAPITAL LETTER SHORT I to 0xD0 0x99Znaki od U+0800 do U+FFFF zapisywane są na trzech bajtach, np.: U+2C97 COPTIC SMALL LETTER LAULA to 0xE2 0xB2 0x97Znaki od U+10000 do U+10FFFF zapisywane są na czterech bajtach, np.: U+1F596 RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS to 0xF0 0x9F 0x96 0x96U+0104 LATIN CAPITAL LETTER A WITH OGONEK należy do drugiego zakresu, więc wymaga dwóch bajtów. |
|
McAffey Temat założony przez niniejszego użytkownika |
» 2013-12-30 20:22:27 No tak, dzięki wielkie, już wszystko jasne :) Jeszcze dla przyszłych czytających, gdyby się zastanawiali jak interpretować zdanie to wystarczy ( int )( char( 0x84 ) ); Tak samo 0x84 typu char, to -124. Już wszystko rozumiem, jeszcze raz dzięki za pomoc :) |
|
« 1 » |