Java a čeština v řetězcích

Honza

Java a čeština v řetězcích
« kdy: 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
« Poslední změna: 24. 02. 2013, 20:18:16 od Petr Krčmář »


Pavel Tišnovský

Re:JAVA - Problém s češtinou
« Odpověď #1 kdy: 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.

Re:JAVA - Problém s češtinou
« Odpověď #2 kdy: 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é.

DarkKnight

Re:JAVA - Problém s češtinou
« Odpověď #3 kdy: 23. 02. 2013, 16:41:57 »
misto Scanneru zkus InputStreamReader spolecne treba s BufferedReaderem

Natix

Re:JAVA - Problém s češtinou
« Odpověď #4 kdy: 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");


Re:JAVA - Problém s češtinou
« Odpověď #5 kdy: 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.

alef0

Re:JAVA - Problém s češtinou
« Odpověď #6 kdy: 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.

mvc

Re:JAVA - Problém s češtinou
« Odpověď #7 kdy: 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());

Pavel Tišnovský

Re:JAVA - Problém s češtinou
« Odpověď #8 kdy: 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]

Natix

Re:JAVA - Problém s češtinou
« Odpověď #9 kdy: 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.

alaik

Re:JAVA - Problém s češtinou
« Odpověď #10 kdy: 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..

alef0

Re:JAVA - Problém s češtinou
« Odpověď #11 kdy: 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 :-)

alaik

Re:JAVA - Problém s češtinou
« Odpověď #12 kdy: 23. 02. 2013, 22:47:45 »
Další důvod používat pro build Maven..

Natix

Re:JAVA - Problém s češtinou
« Odpověď #13 kdy: 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í.

podlesh

Re:JAVA - Problém s češtinou
« Odpověď #14 kdy: 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?
  • windows-specific problém na linuxovém fóru
  • konverze prázdného řetězce do jiného kódování a zase zpět
  • člověk který si myslí že metoda vracející null je bug v IDE a chce to řešit výměnou kompilátoru

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

  • windows nepoužívají UTF-8, to byla ta původní chyba v programu (a zcela nezávislá na tom že se jedná o javu)
  • řetězec (String) v Javě (JVM) je vždy unicode a nikdy jinak; neexistují žádná metdata typu "toto je UTF-8" nebo "teď používáme cp1250"
  • System.console() v javadocu výslovně říká, že může vracet null pokud dané JVM nemá žádnou konzoli; je kvůli OS kde je  textová konzole "optional" a ne každý proces ji má (tedy jiné OS než UNIXového typu, především Windows)