Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java, Scanner ja ääkköset

Zacchon [16.07.2014 14:13:09]

#

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.

TuomasK [16.07.2014 14:45:00]

#

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);

Zacchon [16.07.2014 20:50:41]

#

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.

Metabolix [16.07.2014 21:09:58]

#

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

Zacchon [17.07.2014 09:36:11]

#

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?

Metabolix [17.07.2014 18:44:37]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta