Teen ohjelmaa, joka luo tekstitiedoston ja ohjelma kirjoittaa sinne suomalaisia nimiä. Nimien ä ja ö korvautuu ,, tyylisesti. Ajattelin, että riittää, että kirjoitan ohjelmassa nimien ä ja ö tilalle tyylii \x84 (= ä), mutta ei riittänytkään. Tulostus windowsin konsolissa ennen tiedostoon kirjoittamista toimii tuolla konstilla, mutta tiedostoon viennissä ei toiminutkaan...
Onko tähän mitään yksinkertaista temppua? Hakukoneilla tuli jotain utf locale juttuja, mutta menee itseltä yli nämä utf jutut...
ne pirun ÄÄkÖset ja C++...?
5
2249
Vastaukset
- linuxkoodari
Toi Windows ei ole mulle tuttu ympäristä, mutta olisiko tästä apua? http://stackoverflow.com/questions/10774463/how-to-read-umlaut-from-file
- plörtsis
Kyseessä on vain merkistö-ongelma. Kirjoitat ne ääkköset ihan oikein windowsin komentorivin oletuksena käyttämälle merkistölle koodisivu 850 (http://en.wikipedia.org/wiki/Code_page_850). Avaat sitten tiedoston käyttäen windowsin oletusmerkistöä jossa ääkköset ovat eripaikassa kuin koodisivulla 850.
Tämän voit helposti todentaa tulostamalla kirjoittamasi tiedoston sisällön käyttäen "type" komentoa komentoriviltä esim. "type nimet.txt". Kokeile tämän jälkeen vaikkapa vaihtaa komentorivin koodisivua 1252 , suorita ohjelmasi uudelleen ja avaa sitten tiedosto notepadillä.
Sitten vain lukemaan unicodesta ja utf8:sta kuinka maailma pelastui- plörtsiss
unohtui kertoa kuinka vaihdat koodisivun komentoriviltä "chcp 1252". En ole 100% varma että toimii just noin ja olen laiska testailemaan nyt. Kannattaa kuitenkin kokeilla :)
- koodiministeri
Vastaus tulee vähän myöhässä (keskustelu yli ½ vuotta vanha), mutta ajattelin silti kirjoittaa, koska tämä tuskin on viimeinen kerta kun ihmisilä on ongelmia ääkkösten ja windowsin komentorivin kanssa...
Eli, windowsissa on sellainen funktio kuin OemToCharA, jolla voi konvertoida merkkijonoja komentorivin käyttämästä merkistöstä muun järjestelmän ymmärtämään muotoon. Jos esim. olet lukenut komentoriviltä käyttäjän syöttämän merkkijonon char-taulukkoon nimeltä puskuri, ja haluat kirjoittaa sen tiedostoon tai antaa parametrina jollekin funktiolle, niin se konvertoidaan kutsulla OemToCharA(puskuri, puskuri). Tämän jälkeen sen pitäisi kirjoittua tiedostoon niin, että se näkyy oikein eli ilman merkistöongelmia mm. notepadissä (teksti on nyt siis konvertoitu windows-1252-merkistöön, joka on mm. notepadin oletusmerkistö).
Jos taas haluat tulostaa tiedostosta tekstiä komentoriville, niin voit käyttää funktiota CharToOemA, joka toimii vastaavalla tavalla kuin OemToCharA, mutta tekee merkistökonversion vastakkaiseen suuntaan.
Chcp-komento ei valitettavasti toimi niin kuin sen pitäisi, esim. jos yrittää vaihtaa merkistön windows-1252:ksi komennolla chcp 1252, niin näppäimistöltä syötetyt ääkköset näkyvät sen jälkeen väärin. Mutta minkäs teet, windowsin komentorivi vain on aikamoinen bugipesä, eikä sen korjaaminen näytä paljon microsoftia kiinnostavan... - merkkikoodaus_selvä!
Windowsissa merkistöasiat toimivat näin:
komentoriviohjelmissa:
Oletus on se, että näppäimistön ja näytön osalta komentoriviohjelmissa käytetään ns. OEM -merkistöä. Tämä on sama asia kuin koodisivu 437 tai koodisivu 850.
Laitteiston oletus on 437, ja windowsin jenkkiversiossa 437 on myös oletus.
Windowsin suomenkielisessä versiossa oletus on 850.
MS-DOS -tekstitiedostot myös käyttävät koodistoa 437 tai 850.
Windows -tekstitiedostot taas käyttävät ns. ANSI -merkistöä. Tässä yhteydessä ANSI on ns. pseudonyymi. Se tarkoittaa Suomessa, USA:ssa, ja useimmissa länsieuroopan maissa Windows-1252 -koodistoa.
Myös ne windows -ohjelmat, jotka eivät käytä UNICODEa, käyttävät em. ANSI (ei usein = Windows-1252) -merkkikoodausta.
UNICODEa lukuunottamatta kaikki em. merkistöt ovat ns. kiinteän merkkipituuden merkistöjä, joissa 1 merkki = 1 tavu = 8 bittiä.
Windows API -funktiokutsuista:
Useimmilla API -funktioilla on kaksi versiota, esim:
SetCurrentDirectoryA (käyttää em. ANSI -merkkivalikoimaa)
SetCurrentDirectoryW (käyttää UTF-16 -koodattua UNICODE -merkkivalikoimaa)
UNICODE taas on mielenkiintoinen systeemi.
Siinä jokaisella merkillä on ns. järjestysnumero, joka on 0 ja 10FFFFh väliltä, mutta tietyt arvot ovat joko pysyvästi kiellettyjä tai varattu erityistarkoituksiin.
esim. iso "A" -kirjain, sen UNICODE -koodi on 65 = 41h = U 0041 = U 000041.
Lisämausteen asiaan antaa se, että microsoftilaisessa kielenkäytössä usein UNICODE = UTF-16LE.
Mutta varsinaisesti UNICODE siis kertoo vain sen, mikä kokonaisluku vastaa mitäkin merkkiä, ja sitten on vielä oma lukunsa, miten tuo kokonaisluku esitetään tavuina muistissa tai tiedostossa.
Tähän on useita tapoja:
UTF-8
UTF-16
UTF-32
UCS-2
UCS-4
UTF-8 on aina sama asia, mutta jokaisesta muusta em. vaihtoehdosta on vielä 2 varianttia, eli esim. UTF 16:n osalta:
UTF-16LE
UTF-16BE
UTF-8:ssa siis EI ole kahta erilaista varianttia.
Lisäksi näissä on pareittain seuraavat säännöt:
Jos teksti on kelvollista UCS-2:ta, se on samalla myös kelvollista UTF-16:ta, mutta sama ei välttämättä päde toisinpäin.
Sensijaan UCS-4 ja UTF-32 ovat synonyymejä.
Tämä johtuu siitä, että UCS-2 rajoittuu ns. BMP:hen (=Basic multilingual page, unicode -koodit 0..0FFFFh), mutta UTF-16 tarjoaa tien ulos tuosta rajoituksesta ns. LOW/HIGH surrogate -systeemin avulla. Eli tällainen surrogate -pari esittää yhtä merkkiä, jonka koodi > 65535.
MSDN:stä kannattaa katsoa nämä 2 funktiota:
CharToOemBuff
OemToCharBuff
Muuntavat merkkivalikoiman komentorivin OEM ja muun windowsin käyttämän merkistön välillä.
Ketjusta on poistettu 0 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
Tänään pyörit ajatuksissa enemmän, kun erehdyin lukemaan palstaa
En saisi, silti toivon että sinä vielä palaat ja otetaan oikeasti selvää, hioituuko särmät ja sulaudummeko yhteen. Vuod225124- 254278
- 272441
- 342234
- 371988
- 151908
En ole koskaan kokenut
Ennen mitään tällaista rakastumista. Tiedän että kaipaan sinua varmaan loppu elämän. Toivottavasti ei tarvitsisi vain ka191587- 121521
Voi ei! Jari Sillanpää heitti keikan Helsingissä - Hämmästyttävä hetki lavalla...
Ex-tangokuningas on parhaillaan konserttikiertueella. Hän esiintyi Savoy teatterissa äitienpäivänä. Sillanpää jakoi kons211237Kerranki asiat oikein
Ilkka ja muut pienpuolueeet...teitte hyvän työn kun valitsitte pätevän henkilön virkaan eikä kepulle passelia!! Jatkakaa101164