Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Honza 23. 02. 2013, 15:12:27

Název: Java a čeština v řetězcích
Přispěvatel: Honza 23. 02. 2013, 15:12:27
Dobrý den,

kód by měl udělat následující: Když uživatel zadá 4 slova nebo písmena, spojí je to dohromady a vypíše. Ovšem s českými znaky si to nedokáže poradit. Nevěděl by někdo jak to poupravit, aby to louskalo i české znaky? Děkuji moc !!

Kód:
Kód: [Vybrat]
Scanner sc = new Scanner(System.in, "UTF-8");
        String vstup = new String("".getBytes(), "UTF-8");

        for (int i = 0; i < 4; i++) {
            vstup = vstup + sc.next();
        }
        System.out.println(vstup);


Honza
Název: Re:JAVA - Problém s češtinou
Přispěvatel: Pavel Tišnovský 23. 02. 2013, 16:04:00
Dobrý den,

kód by měl udělat následující: Když uživatel zadá 4 slova nebo písmena, spojí je to dohromady a vypíše. Ovšem s českými znaky si to nedokáže poradit. Nevěděl by někdo jak to poupravit, aby to louskalo i české znaky? Děkuji moc !!

Kód:
Kód: [Vybrat]
Scanner sc = new Scanner(System.in, "UTF-8");
        String vstup = new String("".getBytes(), "UTF-8");

        for (int i = 0; i < 4; i++) {
            vstup = vstup + sc.next();
        }
        System.out.println(vstup);


Honza

Běží to na systému s korektně nastaveným Locales? (možná je to OT, ale pozor na to, že Javovské programy startované z cmd.exe ve Windows mají většinou kódování nastavené jinak než zbytek systému. Btw. vstup stačí inicializovat takto: String vstup="" a ještě lepší je použít StringBuilder a spojovat přes append.
Název: Re:JAVA - Problém s češtinou
Přispěvatel: voldaja1 23. 02. 2013, 16:40:20
Se Stringem problém není, ten pracuje správně, ale Scanner(system.in, "UTF-8") neumí číst vstup od uživatele s češtinou. Zjednodušeně:

Kód: [Vybrat]
Scanner sc = new Scanner(System.in, "UTF-8");
       System.out.println(sc.next()); //Některý znaky to nepřečte vůbec a některé vypíše jako neznámé.
Název: Re:JAVA - Problém s češtinou
Přispěvatel: DarkKnight 23. 02. 2013, 16:41:57
misto Scanneru zkus InputStreamReader spolecne treba s BufferedReaderem
Název: Re:JAVA - Problém s češtinou
Přispěvatel: Natix 23. 02. 2013, 16:49:07
Pokud program spouštíš přímo z cmd, tak zkus:
Kód: [Vybrat]
Scanner scanner = new Scanner(System.in, "Cp1250");
Název: Re:JAVA - Problém s češtinou
Přispěvatel: voldaja1 23. 02. 2013, 17:09:13
Pokud program spouštíš přímo z cmd, tak zkus:
Kód: [Vybrat]
Scanner scanner = new Scanner(System.in, "Cp1250");

Hej, díky moc. Šlape to tak jak by mělo.
Název: Re:JAVA - Problém s češtinou
Přispěvatel: alef0 23. 02. 2013, 18:14:04
Kodovanie nie je potrebne v Scanneri uvadzat -- java.util.Scanner si ho vezme na zaklade systemoveho kodovania platformy. Inak vas program je takto prudko neportabilny (ubohi linuxaci a ich cp1250).

Okrem toho, od Javy 6 existuje fintiva trieda java.io.Console, kde sa da radostne nacitavat zo vstupu bez velkych tazkosti.
Název: Re:JAVA - Problém s češtinou
Přispěvatel: mvc 23. 02. 2013, 18:27:28
Tvůj kód je plný antipatternů. Jednak instance stringu se ručně nevytváří, dále víc než dva stringy jednorázově se nesčítají a nakonec problém s kódováním, o kterém už mluvil alef0.

Zkus to takhle:
Kód: [Vybrat]
Scanner sc = new Scanner(System.in);
StringBuilder builder = new StringBuilder();

for (int i = 0; i < 4; i++)
{
    builder.append(sc.next());
}

System.out.println(builder.toString());
Název: Re:JAVA - Problém s češtinou
Přispěvatel: Pavel Tišnovský 23. 02. 2013, 18:49:03
Dokonce si muze odpustit i to volani toString(), to uz si zaridi System.out.println() ;)

[stejne by me zajimalo, kdyz uz se na skolach uci konkatenace stringu pomoci +, jestli k tomu rikaji i vsechny klady a zapory]
Název: Re:JAVA - Problém s češtinou
Přispěvatel: Natix 23. 02. 2013, 21:06:48
Kodovanie nie je potrebne v Scanneri uvadzat -- java.util.Scanner si ho vezme na zaklade systemoveho kodovania platformy. Inak vas program je takto prudko neportabilny (ubohi linuxaci a ich cp1250).

Okrem toho, od Javy 6 existuje fintiva trieda java.io.Console, kde sa da radostne nacitavat zo vstupu bez velkych tazkosti.

java.io.Console má jednu zásadní nevýhodu - nefunguje v Eclipse (System.console() vrací null). U NetBeanů nevím.
Název: Re:JAVA - Problém s češtinou
Přispěvatel: alaik 23. 02. 2013, 21:39:10
java.io.Console má jednu zásadní nevýhodu - nefunguje v Eclipse (System.console() vrací null). U NetBeanů nevím.

Jaké používáš JDK? Kdyby byla pravda, že Eclipse IDE mění chování překladače, byl by to velký bug..
Název: Re:JAVA - Problém s češtinou
Přispěvatel: alef0 23. 02. 2013, 21:57:38
Natix ma pravdu, mna to velmi prekvapilo:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=122429

Mozno je to tym, ze konzolove aplikacie su nie-az-take-bezne, povedal by som, ze jadro tvoria zapoctaky, kde je snaha namigrovat Pascal/C zadania do Javy :-)
Název: Re:JAVA - Problém s češtinou
Přispěvatel: alaik 23. 02. 2013, 22:47:45
Další důvod používat pro build Maven..
Název: Re:JAVA - Problém s češtinou
Přispěvatel: Natix 23. 02. 2013, 22:53:37
Další důvod používat pro build Maven..

Tohle nijak nesouvisí s tím jestli pro kompilování používáš javac nebo JDT a jestli builduješ Antem nebo Mavenem. Problém je v tom, jakým způsobem se spouští JVM s daným programem. Pokud ten proces spustíš přímo ze shellu, tak ta instance JVM má přiřazenou konzoli, zatímco pokud se ta JVM spouští Eclipsou, tak tam žádná systémová konzole holt není.
Název: Re:JAVA - Problém s češtinou
Přispěvatel: podlesh 24. 02. 2013, 00:53:42
Vidím že už se to stejně trochu zvrhlo, takže bych měl takovou anketní otázku: co je větší WTF?

No a trochu na vážnější notu, asi by bylo dobré doplnit nějaké poučení: