ne pirun ÄÄkÖset ja C++...?

voi locale

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...

5

2385

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • linuxkoodari
    • 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

    1. Tulipalossa henkilövahinkoja, itsenäisyyspäivä alkoi huonosti, poliisi tiedottaa lisää

      Savonlinna https://www.como.fi/uutiset/savonlinna-henkilovahinkoja-tulipalossa-poliisi-tiedottaa-lisaa/
      Savonlinna
      116
      10682
    2. Ennen ei ollut persuja ja työttömyyttä, lääkäriinkin pääsi

      Ennen oli kaikilla töitä Kauppiaille kelpasi kun saivat voittoa Yritystukia ei ollut Lääkäriin pääsi kaikki haluklaat Nu
      Maailman menoa
      130
      4271
    3. Millaista läheisyyttä

      Toivoisit ikävästi kohteesi kanssa?
      Ikävä
      117
      4030
    4. Somali ei kätellyt Stubbia Linnan juhlissa

      Miksei somali osaa noudattaa hyviä käytöstapoja. https://www.iltalehti.fi/viihdeuutiset/a/563a3dea-fa3f-41f3-b64f-406d2
      Maailman menoa
      443
      3879
    5. Mones päivä kaivattusi on syntynyt?

      😁
      Ikävä
      61
      3556
    6. Antifasismi - mitä se on?

      Se on äärivasemmistolaista anarkistista toimintaa joka käyttää fasisminvastaisuutta keppihevosena oikeuttaakseen toimint
      Maailman menoa
      54
      2806
    7. Kuka on menehtynyt?

      https://yle.fi/a/74-20198293 Kuulemani mukaan ryyppyporukka ollut hapualla ja kuolemanenkeli (F.G) eli mies jonka seuras
      Kankaanpää
      19
      2346
    8. Heräsin taas ikävään

      Ja aivan valtavaan haluun. Tahdon sinua R. ❤️
      Ikävä
      57
      2009
    9. Kauhea ikävä iski

      Mietin vain, mitä olet juuri nyt tekemässä. Mietin myös, välittyykö se sinulle, kun olet koko ajan mielessäni, tunnetko
      Ikävä
      19
      1592
    10. Kemijärven kapungin teknisen osaston johtajat

      KossuPekka ja KankaarannanMarkku olivat hyviä näissä tehtävissään. Tulevan vuodenvaihteen jälkeen tulee Kemijärvelle uu
      Kemijärvi
      8
      1439
    Aihe