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
2356
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
- 2024248
SDP haluaa 40 000 nettomaahanmuuttajaa
SDP:n Suunnanmuutos-vaihtoehtobudjetissa, käy ilmi, että demarit itse asiassa vaativat räjähdysmäistä ”työperäisen” maah1463798Orpo: Velkajarrua vastustavaa puoluetta vaikea ajatella hallitukseen
No Minja Koskelan kommunistipuolue jäi ulos tuosta. Kaikki eduskuntapuolueet vasemmistoliittoa lukuun ottamatta sopivat1363245Hienoa! Eduskunta luopui käteisen käytöstä
Nyt tuo sama muutos pitää saada myös muuhun yhteiskuntaan. Käteistähän ei tarvitse tänä päivänä enää kuin rikolliset.471629Ikävä sinua mies
Vuosia kuluu, mutta tunteet ei ole hävinnyt. Tasoittuneet toki, kun ei olla nähty. Järki palannut päähän kuitenkin. Se i191508Mikä tämä henkilö mahtaa touhuta Parkanossa
Kamalaa https://www.ylasatakunta.fi/teksti/pirkanmaan-karajaoikeus-vangitsi-koiran-tappamisesta-epaillyn-6.68.127794.b58341450Sulla on avaimet ja keinot
Jos haluat jatkaa tutustumista. Itse olen niin jäässä etten pysty tekemään enää mitään. Pidempi keppi johon on helpompi251385Orpo loukkaantui fasismiin viittaavasta sanavalinnasta
Mutta miksi loukkaantui? Orpohan on tehnyt yhteistyötä fasistien kanssa jo vuonna 2019, siis jo neljä vuotta ennen loukk271351Kiinnostaa - ei kiinnosta - kiinnostaapas
Selittäkää hämmentyneelle miksi miehiä ei ikinä kiinnosta silloin, kun sitä olisi itsekin kiinnostunut? Sitten kun siirt1161160Martina haluaa Marbellaan
Martinan tekisi mieli ottaa lennot Marbellaan, jossa näkisisi kauniita ja hyväntuulisia ihmisiä. No sitten pitää matkust2151063