Haluaisin tallentaa Javassa käyttäjän syötteen, mutta Scanner ei osaa lukea ääkkösiä. Alla on yksinkertainen esimerkkikoodi. Kuten koodista näkyy, String-muuttujaan ääkkösiä voi tallentaa, joten vika ei ole siinä vaan nimenomaan Scannerin lukemisessa.
Scanner skanneri = new Scanner(System.in); System.out.print("Sano sana: "); String sana = skanneri.nextLine(); System.out.println(sana); String sana0 = "pässi"; System.out.println(sana0);
Esimerkkitulostus koodia ajettaessa:
Sano sana: pässi
p�ssi
pässi
Asia ei korjaannu, vaikka antaisin Scannerille parametriksi UTF-8-merkistön. Muistaakseni se on ennen toiminut.
Scanner skanneri = new Scanner(System.in, "UTF-8");
Käytän Netbeansia Windows 8:lla. Mitenkähän saisin ääkkösten lukemisen toteutettua? Projektin ominaisuuksista voi vaihtaa merkistökoodauksen, mutta se on jo oletuksena UTF-8, joten siitä ei ole apua.
Tässä koodivinkissä kerrotaan asiasta
Metabolix kirjoitti:
System.console().writer().printf("Syötä yksi sana: ").flush(); java.util.Scanner input = new java.util.Scanner(System.console().reader()); String sana = input.next(); System.console().writer().println("Kirjoitit: " + sana);Toinen mahdollisuus on lukea metodilla System.console().readLine() ja tulostaa metodilla System.console().printf().
System.console().printf("Syötä rivi tekstiä: "); String rivi = System.console().readLine(); System.console().printf("Kirjoitit: %s\n", rivi);
Jostain syystä tämä koodi aiheuttaa NullPointerExceptionin:
Console konsoli; konsoli = System.console(); Reader lukija; lukija = konsoli.reader();
NullPointer tapahtuu viimeisellä rivillä, kun Reader-muuttujaan yritetään asettaa arvo. Se tarkoittanee siis, ettei konsolilla ole Readeria. Uteliaisuuttani kokeilin samaa koodia Windows 7:lla (itselläni 8). Se ei vaikuttanut asiaan.
Koodivinkissä kerrotaan, että poikkeus tulee, jos konsolia ei ole. Ilmeisesti ajat ohjelman jotenkin poikkeavasti – ehkä Eclipsen tms. kautta? –, jolloin konsoli puuttuu. Poikkeus tulee tietenkin kohdassa ”konsoli.”, jossa yrität käyttää tyhjää viittausta.
Alkuperäinen ajatuksesi UTF-8:sta ei ole loppuun asti ajateltu. Skannerille pitää antaa syötteen merkistö, joka ei varmasti ole Windowsissa UTF-8 vaan jotain muuta. Se saattaa olla esimerkiksi CP850 tai ISO-8859-1. Merkistön valitseminen väkisin aiheuttaa luonnollisesti sen, että ohjelma ei taas toimi muissa ympäristöissä kuin omassasi.
Netistä löytyy hyvinkin luovia ratkaisuja. :D
Ajoin koodia siis Netbeansissa. Ohjelmaani en tarvitse muualla kuin siellä, ja ääkköset sain toimimaan antamalla sekä projektille että skannerille merkistön ISO-8859-1.
Kokeilin linkkaamaasi koodia (alempaa), ja ääkkösten lukeminen ei toiminut ennen kuin laitoin projektin merkistöksi koodista tulostamani IBM850:n. Tämäkään ei siis kai toimi mitenkään universaalisti, ellei projektin merkistöä voi vaihtaa koodista käsin?
Zacchon kirjoitti:
projektin merkistö – –
Ymmärtääkseni tämä ”projektin merkistö” on NetBeansin sisäinen ominaisuus eikä vaikuta käännetyn ohjelman toimintaan mitenkään. (Käännösvaiheessa saattaa kylläkin vaikuttaa siihen, tulkitaanko koodin sekaan kirjoitetut ääkköset oikeiksi Unicode-merkeiksi.) Sen sijaan asetus ilmeisesti vaikuttaa NetBeansin konsolin toimintaan ja sitä kautta ohjelman lopputulokseen. IBM850 tai CP850 on MS-DOSin ja Windowsin komentorivin tavanomainen merkistö suomen kielelle.
Aihe on jo aika vanha, joten et voi enää vastata siihen.