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
2220
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
Ja taas ammuttu kokkolassa
Kokkolaisilta pitäisi kerätä pois kaikki ampumaset, keittiöveitset ja kaikki mikä vähänkään paukku ja on terävä.726348- 1385772
Helena Koivu on äiti
Mitä hyötyä on Mikko Koivulla kohdella LASTENSA äitiä huonosti . Vie lapset tutuista ympyröistä pois . Lasten kodista.4863654Ovatko naiset lopettaneet sen vähäisenkin vaivannäön Tinderissa?
Meinaan vaan profiileja selatessa nykyään valtaosalla ei ole minkäänlaista kirjoitettua tekstiä siellä. Juuri ja juuri s1202059- 391361
Suomi vietiin Natoon väärin perustein. Viides artikla on hölynpölyä. Yksin jäämme.
Kuka vielä uskoo, että viides artikla takaa Suomelle avun, jos Suomeen hyökätään. Liikuttavasti täällä on uskottu ja ved4021345- 731173
Sydämeni on sinun luona
Koko ajan. Oli ympärilläni ketä oli niin sinä olet vain ajatuksissa ja tunteissa. En halua muiden kosketusta kuin sinun471034Trump ja Venäjä
Huomasitteko muuten... Käytännössä ainoat valtiot, joille Trump EI eilen asettanut typeriä tariffejaan, olivat Venäjä ja110952Jatkuva stressitila
On sinun vuoksesi kun en tiedä missä mennään mutta tunteeni tiedän ainoastaan56950