W Javie mam ciąg znaków i chcę go zakodować jako tablicę bajtów (w UTF8 lub innym kodowaniu). Alternatywnie mam tablicę bajtów (w znanym kodowaniu) i chcę przekonwertować ją na ciąg Java. Jak wykonać te konwersje?
java
string
encoding
character-encoding
mcherm
źródło
źródło
Oto rozwiązanie, które pozwala uniknąć wyszukiwania Charset dla każdej konwersji:
źródło
StandardCharsets.UTF_8
ze stałego sposobu uzyskiwania dostępu do zestawu znaków UTF-8.źródło
Możesz konwertować bezpośrednio za pomocą konstruktora String (bajt [], String) i metody getBytes (String). Java udostępnia dostępne zestawy znaków za pośrednictwem klasy Charset . Dokumentacja JDK zawiera listę obsługiwanych kodowań .
W 90% przypadków takie konwersje są przeprowadzane w strumieniach, więc korzystasz z klas Reader / Writer . Nie będziesz dekodował przyrostowo przy użyciu metod String w dowolnych strumieniach bajtów - wystawiłbyś się na błędy dotyczące znaków wielobajtowych.
źródło
UTF-8
, jakie są obawy dotyczące znaków wielobajtowych?Moja implementacja tomcat7 akceptuje ciągi jako ISO-8859-1; pomimo typu treści żądania HTTP. Poniższe rozwiązanie działało dla mnie, gdy próbowałem poprawnie interpretować znaki takie jak „é”.
Podczas próby interpretacji ciągu jako US-ASCII informacje o bajcie nie zostały poprawnie zinterpretowane.
źródło
StandardCharSets.UTF_8
iStandardCharSets.ISO_8859_1
.Alternatywnie można użyć StringUtils z Apache Commons.
lub
Jeśli masz niestandardowy zestaw znaków, możesz odpowiednio użyć getBytesUnchecked () lub newString () .
źródło
Aby zdekodować serię bajtów do normalnej wiadomości łańcuchowej, w końcu udało mi się to pracować z kodowaniem UTF-8 za pomocą tego kodu:
źródło
Jeśli używasz 7-bitowego ASCII lub ISO-8859-1 (niezwykle popularny format), nie musisz wcale tworzyć nowego java.lang.String . Znacznie bardziej wydajne jest po prostu rzutowanie bajtu na char:
Pełny przykład działania:
Jeśli nie używasz znaków rozszerzonych, takich jak Ę, Æ, Å, Ç, Ï, Ê i możesz być pewien, że jedynymi przesyłanymi wartościami są pierwsze 128 znaków Unicode, ten kod będzie również działał dla UTF-8 i rozszerzonego ASCII (jak CP-1252).
źródło
Nie mogę komentować, ale nie chcę zaczynać nowego wątku. Ale to nie działa. Prosta podróż w obie strony:
Potrzebuję b [] tej samej tablicy przed i po kodowaniu, która nie jest (to odsyłacze do pierwszej odpowiedzi).
źródło
źródło
źródło
źródło
strasznie późno, ale właśnie napotkałem ten problem i oto moja poprawka:
źródło