Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Nefunguje kódování češtiny při komunikaci přes JAVA New I/O

Zdravím,
sice ani moc nedoufám, že by to tady někdo věděl, když mi nedokázali odpovědět ani na builder.cz, ale přesto to sem zkusím dát. Takže, mám napsanou chatovací aplikaci (JAVA program k bakalářce, má serverovou a klienstou část) přes New I/O, všechno funguje jak má, jen mi nejdou odesílat zprávy obsahující české znaky, zprávy bez českých znaků se mi mezi klienty posílají normálně (komunikace mezi klienty probíhá přes server). Klient má jednoduché GUI složené z JTextArea, JTextField, a JButton pro odesílaní zpráv. Ve vlákně načítám příchozí zprávy z NIO serveru a zapisuji je metodou append() do JTextArea. Problém bude zřejmě v kodování znaků, jelikož se musí používat třídu CharsetDecoder asciiDecoder = Charset.forName("US-ASCII").newDecoder(); pro dekódování stringů z NIO bufferu. Zkoušel jsem změnit charset na všechny možnosti uváděné v dokumentaci k NIO API. Tady jsou:

US-ASCII   Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of
           the Unicode character set
ISO-8859-1 ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1
UTF-8      UCS Transformation Format
UTF-16BE   Sixteen-bit UCS Transformation Format, big-endian byte order
TF-16LE    Sixteen-bit UCS Transformation Format, little-endian byte order
UTF-16     Sixteen-bit UCS Transformation Format, byte order identified by an
           optional  byte-order mark

S ISO-8859-1 to fungovalo nejlépe, zprávy se posílaly, ale zase byly místo některých českých znaků otazníky. Neví někdo, co stím? Jsem v koncích. :-(

Díky!
MaSo

Předmět Autor Datum
Na strane odosielateľa musíš reťazec zakódovať do poľa bajtov a na strane prijímateľa zasa naopak de…
los 13.02.2008 09:09
los
Losi, díky! Na tvůj popud jsem si prošel znovu (už asi po 10té) celý kód klienta i serveru. Nevím na… poslední
MaSo 13.02.2008 14:48
MaSo

Na strane odosielateľa musíš reťazec zakódovať do poľa bajtov a na strane prijímateľa zasa naopak dekódovať z poľa bajtov do reťazca. V obidvoch prípadoch musíš použiť rovnaké kódovanie, najlepšie UTF-8.

Najskôr robíš chybu v zakódovaní alebo dekódovaní reťazca, takže ak tam stále nevidíš žiadnu chybu, tak si sprav úplne jednoduchý program, ktorý reťazec zakóduje a hneď aj dekóduje - výsledkom musí byť pôvodný reťazec.

Losi, díky! Na tvůj popud jsem si prošel znovu (už asi po 10té) celý kód klienta i serveru. Nevím na co jsem myslel, když jsem to navrhoval... Zjistil jsem, že ve svém kodu vůbec neřeším zakódování toho řetězce, pouze jeho dekódování!

Volal jsem na pouze metodu getBytes() třídy String. Takže se asi používalo nějaké implictní kodování, asi US-ASCII. Vůbec jsem si, ale nevšim, že existuje i metoda getBytes (String charsetName).

Samozřejmě po použítí getBytes("UTF-8"), funguje vše jak má. Uff. Ještě jednou díky, za nakopnutí...:-):beer:

Zpět do poradny Odpovědět na původní otázku Nahoru