Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: wxString -> char*

Sivun loppuun

kayttaja-3842 [12.03.2007 08:22:41]

#

Joo eli ongelma on se, että en saa syystä tai toisesta wxString:iä
käännetyksi Char*:ksi.


Tämän tulos on minulla tyhjä!

wxString string(_T("Some text"));
const char* ascii_str = (const char*)string.mb_str(wxConvUTF8);

Tämän tulos on eka kirjain eli "S"

wxString string(_T("Some text"));
const char* ascii_str = (const char*)string.c_str();

Tämän tulos on myös eka kirjain eli "S"

wxString string(_T("Some text"));
const char* ascii_str = (const char*)string.fn_str();

Eli miten saan käänetyksi muuttujaan tuon koko tekstin "Some text"

feenix [12.03.2007 16:08:15]

#

Jälkimmäiset pelkät S:t on helppoja, tuo käyttää sisäisesti UTF-16:a, joten joka toinen tavu on 0 tuossa tekstissä. wchar_t on sopivampi tuossa tapauksessa.

wx:stä en niin paljoa tiedä että osaisin sanoa miksi ensimmäinen ei toimi, tuon konversio UTF-8:ksi on kuitenkin simppeli. Pikaisella haulla en kuitenkaan löytänyt mainintaa wxConvUTF8:n sopivuudesta tuolle (kai se sopii kun ei kerran valita), ainakin löytyi WC2MB jne jotka voisivat asiassa tehdä jotain sopivaa.

Joka tapauksessa pitää ottaa huomioon haluatko ulostaa UTF-8:a vai tehdä muunnoksen johonkin koodisivuun (esim Latin9) ja sen mukaan toimia.

kayttaja-3842 [25.03.2007 16:33:08]

#

Siis ongelmahan on, että en voi käyttää wxChar:ia, koska data joka ensiksi otetaan muuttujaa, niin muuttujan tyypin pitää olla wxString.

Metabolix [25.03.2007 16:50:42]

#

Ei kai tässä kukaan ole wxCharia käskenyt käyttääkään. Sait selvän ohjeen:

feenix kirjoitti:

Jälkimmäiset pelkät S:t on helppoja, tuo käyttää sisäisesti UTF-16:a, joten joka toinen tavu on 0 tuossa tekstissä.

Siis jos haluat vain ASCIIta käsitellä ja uskallat olettaa, että saat vain sellaista, voit vain heivata saamastasi tekstistä joka toisen tavun pois. En nyt ole aivan varma, kumpi tavu kuuluu poistaa, ja muutenkaan en wx:ää tunne, mutta tämän ketjun tietojen perusteella sanoisin näin:

// char teksti[SOPIVA_KOKO]; const char *str = (const char*)string.c_str(); tjsp.
for (i = 0; i < pituus; ++i) {
    teksti[i] = str[2 * i];
}
teksti[i] = 0; // Lopetusmerkki tietenkin.

Blaze [25.03.2007 17:54:28]

#

Metabolix kirjoitti:

En nyt ole aivan varma, kumpi tavu kuuluu poistaa

Sehän riippuu endiaanisuudesta :)
Oletus kai pitäis olla big endian (nollat ensin), ja x86 (ts. little endian) -koneella Vimillä UTF-16:na tallennettu tekstinpätkä näytti tallentuvan juurikin big endiaanina.

Metabolix [25.03.2007 18:03:43]

#

Blaze kirjoitti:

Vimillä UTF-16:na tallennettu tekstinpätkä näytti tallentuvan juurikin big endiaanina.

Mutta muistissa (x86:lla) tuo varmaan on kuitenkin little endian, koska pitäähän saman merkin lukuarvon olla sama eri alustoilla, eikö? Jos näin, niin helpoin muuntotapa taitaisikin löytyä sitä kautta.

Deewiant [25.03.2007 20:08:32]

#

Blaze kirjoitti:

Oletus kai pitäis olla big endian (nollat ensin)

Jep: eli jos määritellään vain, että "UTF-16" kertomatta endiaanisuutta, oletetaan, että kyseessä on UTF-16BE. Tiedostojen alussa tulee kuitenkin olla BOM eli Byte Order Mark, eli U+FEFF-koodipiste (code point, oli suomeksi mikä oli). Jos se on enkoodattu muotoon FE FF, kyseessä on UTF-16BE-tiedosto, jos se on FF FE, kyseessä on UTF-16LE-tiedosto.

UTF-32:lla samaten, mutta U+FEFF on tietysti joko muodossa 00 00 FE FF tai FE FF 00 00.

UTF-8:lla taas se on aina muodossa EF BB BF, ja sitä ei ole pakko käyttää, sillä UTF-8:lla on vain yksi endiaanisuus.

Mielessäpidettävää: Windows käyttää UTF-16LE:a.

EDIT:

Metabolix kirjoitti:

Mutta muistissa (x86:lla) tuo varmaan on kuitenkin little endian, koska pitäähän saman merkin lukuarvon olla sama eri alustoilla, eikö?

Pitää toki olla. Muistissa oleva tieto riippunee tosiaan prosessoriarkkitehtuurista (tai jos muuten vaan halutaan häröillä ja laittaa kaikki "väärin päin" muistiin), joten koodisi toimii vain x86-koneilla.

Metabolix [25.03.2007 20:18:51]

#

Ja muunnoshan siis toimisi näin ollen kai kaikilla "hyvin" (jos nyt tuollainen muunnos voi hyvin toimia), kun luettaisiin 16-bittisiä lukuja ja laitettaisiin ne 8-bittisiin muuttujiin, jolloin niistä putoaisi kaikilla se oikea tavu pois. Meikäläisillä 16-bittinen luku on (unsigned) short.

Deewiant [25.03.2007 21:47:15]

#

Deewiant kirjoitti:

UTF-32:lla samaten, mutta U+FEFF on tietysti joko muodossa 00 00 FE FF tai FE FF 00 00.

Ärh, typo. Jälkimmäisen tulisi olla FF FE 00 00.

Lisättäköön vielä, että tuommoinen muunnos toimii vain ASCII-tekstille, eli tavuille välillä 00-7F (0-127).

kayttaja-3842 [26.03.2007 09:01:53]

#

Joo, kiitos paljon vaan kaikille. :D Nytten en voi valittaa niukasta informoinnista....

lainaus:

Mielessäpidettävää: Windows käyttää UTF-16LE:a.

Joo no, ohjelma on lähinnä tulossa vain Linux:lle koska ohjelma tulee vain omaan käyttöön ja itse käytän vain Linux:ia.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta