

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
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í...
