Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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:
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
-
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:
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.
-
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ě:
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é.
-
misto Scanneru zkus InputStreamReader spolecne treba s BufferedReaderem
-
Pokud program spouštíš přímo z cmd, tak zkus:
Scanner scanner = new Scanner(System.in, "Cp1250");
-
Pokud program spouštíš přímo z cmd, tak zkus:
Scanner scanner = new Scanner(System.in, "Cp1250");
Hej, díky moc. Šlape to tak jak by mělo.
-
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.
-
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:
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());
-
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]
-
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.
-
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..
-
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 :-)
-
Další důvod používat pro build Maven..
-
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í.
-
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)