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

2475

    Vastaukset 5

    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. Mikä on totta mikä ei?

      Onko juoru vai ei että nimeltä mainitsematon henkilö on tehnyt naiselle/naisille jotain joka on väärin?
      Kuhmo
      23
      2383
    2. Päivän aivopieru Trumpilta

      Trump julisti sodan hyttysiä vastaan. Myös punkit ovat Trumpin sodan kohteena. Eikö vieläkään USA:n kansa tajua tuon uko
      Maailman menoa
      86
      1586
    3. Lopetetaanko tämä

      Juttu ja mennään eteenpäin? Pystytkö?
      Ikävä
      135
      1003
    4. Just saying

      Mies joka antaa naiselle turvallisen olon, on seksikäs. Ei kieroja kikkoja ja haluaa olla vain sen yhden naisen mies.
      Ikävä
      143
      753
    5. Löytyikö syy miksi Martina on Muhiksen kanssa

      Saipa naurut Gekkosen kuvasta, missä ovat ravintola Hookissa Immu fight night ottelun jälkeen, Muhoksella pullottaa hirv
      Kotimaiset julkkisjuorut
      95
      702
    6. Voisin antaa sulle nyt

      Halin❤️
      Ikävä
      54
      702
    7. Janpen Thai lopettanut, miksiköhän

      Hyvää apetta teki.
      Suomussalmi
      13
      677
    8. Älä unohda minua

      Nainen ethän unohda minua. Asiat olisivat voineet mennä toisin, olisi vain pitänyt uskaltaa lähestyä sinua kun annoit si
      Ikävä
      77
      635
    9. Jorma Uotinen läväytti härskin heiton - Paljastus uudesta TTK-romanssista?

      Tuomari Jorma Uotisen linja on välillä hyvinkin rohkea TTK:ssa. Hän näpäytti Jaakko Parkkalille ja Kastanja Rauhalalle v
      Tanssii tähtien kanssa
      12
      628
    10. Jos selviäisi että kaivattusi

      Olisi savant asperger? Rakastaisitko vielä? Savant-lahjakkuus olisi kapea-alaista neroutta liittyen mekanisiin ja tilan
      Ikävä
      100
      627
    11. On väärin

      Tykätä ja haluta sua kun tilanne täysin mahdoton mutta minkäs teet. Mun sisällä roihuaa 🔥 kunpa tietäisit mitä sä minus
      Ikävä
      42
      603
    12. Tosi kiva on

      Joo. Mitä olisit menettänyt jos olisit paljastanut itsesi?
      Ikävä
      65
      571
    13. Toivotko vielä viestiä

      Minulta? En rohkene enää ottaa yhteyttä, kun varmasti jo uusia naisia elämässä. Nolaisin vain itseni.
      Ikävä
      44
      559
    14. Olen ajellut Dieseleillä yli 50 vuotta.

      Enkä ole koskaan kaivannut sähköautoa.
      Hybridi- ja sähköautot
      141
      555
    15. Tehdään yhdessä itsestämme

      Parhaat versiot❤️ Se vaatii molemmilta hyvää itsetuntoa!
      Ikävä
      42
      540
    16. Miksi jotku naiset on niin tyhmiä

      Että elättelevät turhaa toivoa toisen kustannuksella. Onko ne kaikki kaappilesboja vai mikä niitä vaivaa? Sitten itketä
      Ikävä
      54
      518
    17. Oliko Jani Halmeen aika jo tippua TTK:sta?

      Jani Halme ja Claudia Ketonen joutuivat jättämään TTK:n. Halme ja Ketonen saivat viimeiseksi jäänestä tanssista, sambas
      Tanssii tähtien kanssa
      29
      516
    18. Mitä tunteita

      Sulla vielä on?
      Ikävä
      77
      514
    19. Valtuuston kokous

      Kyl tuo Anita Ruokani on ihan pihalla,käy aika hitaalla.
      Kemijärvi
      41
      513
    20. Kuka kaipaa T m?

      Kerro nainen kirjaimesi vaan... Haluan miettiä kuka tulee ekana mieleeni.. kuin kurkistus tunteiden meren pinnalle, jota
      Ikävä
      36
      510
    Aihe