Konwersja kodowania w Javie

Czy jest jakaś darmowa biblioteka Javy, której mogę użyć do konwersji napisów w jednym kodowaniu na inne kodowanie, coś takiego jak iconv w php? Używam Javy w wersji 1.3.

Author: Seki, 2008-10-23

5 answers

Nie potrzebujesz biblioteki poza standardową-po prostu użyj Charset. (Możesz po prostu użyć konstruktorów łańcuchowych i metod getBytes, ale osobiście nie Lubię tylko pracować z nazwami kodowania znaków. Za dużo miejsca na literówki.)

EDIT: jak zaznaczono w komentarzach, nadal możesz używać instancji Charset, ale masz łatwość użycia metod łańcuchowych: new String (bytes, charset) i String.getBytes (charset) .

 41
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-23 10:28:05

CharsetDecoder to powinno być to, czego szukasz, prawda ?

Wiele protokołów sieciowych i plików przechowuje swoje znaki z zestawem znaków zorientowanym na bajty, takim jak ISO-8859-1 (ISO-Latin-1).
Jednak natywne kodowanie znaków Javy jest Unicode UTF16BE (Szesnastobitowy Format transformacji UCS, kolejność bajtów big-endian).

Zobacz Charset. Nie oznacza to, że UTF16 jest domyślnym zestawem znaków (tzn.: domyślne " mapowanie między sekwencjami szesnastobitowymi jednostki kodu Unicode oraz sekwencje bajtów"):

Każda instancja wirtualnej maszyny Java ma domyślny zestaw znaków, który może być, ale nie musi być jednym ze standardowych zestawów znaków.
[US-ASCII, ISO-8859-1 a. k. a. ISO-LATIN-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16]
Domyślny zestaw znaków jest ustalany podczas uruchamiania maszyny wirtualnej i zazwyczaj zależy od ustawień regionalnych i zestawu znaków używanego przez podstawowy system operacyjny.

Ten przykład pokazuje jak konwersja ISO-8859-1 zakodowanych bajtów w ByteBuffer na łańcuch w CharBuffer i odwrotnie.

// Create the encoder and decoder for ISO-8859-1
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();

try {
    // Convert a string to ISO-LATIN-1 bytes in a ByteBuffer
    // The new ByteBuffer is ready to be read.
    ByteBuffer bbuf = encoder.encode(CharBuffer.wrap("a string"));

    // Convert ISO-LATIN-1 bytes in a ByteBuffer to a character ByteBuffer and then to a string.
    // The new ByteBuffer is ready to be read.
    CharBuffer cbuf = decoder.decode(bbuf);
    String s = cbuf.toString();
} catch (CharacterCodingException e) {
}
 18
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-03 17:32:36

Chciałbym tylko dodać, że jeśli łańcuch jest pierwotnie zakodowany przy użyciu niewłaściwego kodowania, może być niemożliwe, aby zmienić go na inne kodowanie bez błędów. Pytanie nie mówi, że konwersja tutaj jest wykonana z niewłaściwego kodowania do poprawnego kodowania, ale osobiście natknąłem się na to pytanie tylko z powodu tej sytuacji, więc tylko ostrzeżenie dla innych, jak również.

Ta odpowiedź w innym pytaniu daje wyjaśnienie, dlaczego konwersja nie zawsze daje poprawne wyniki https://stackoverflow.com/a/2623793/4702806

 2
Author: wallabui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:53:18

Jest to o wiele łatwiejsze, jeśli myślisz o unicode jako zestaw znaków (który w rzeczywistości jest-jest to w zasadzie zestaw ponumerowanych wszystkich znanych znaków). Można go zakodować jako UTF-8 (w zależności od 1-3 bajtów na znak) lub może UTF-16 (2 bajty na znak lub 4 bajty za pomocą par zastępczych).

Back in the mist of time Java używała UCS-2 do kodowania zestawu znaków unicode. To może obsłużyć tylko 2 bajty na znak i jest teraz przestarzałe. To był dość oczywisty hack do dodania pary zastępcze i przejść do UTF-16.

Wiele osób uważa, że w pierwszej kolejności powinni używać UTF-8. Kiedy Java była pierwotnie napisana, unicode miał znacznie więcej niż 65535 znaków...

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-29 17:34:35

UTF - 8 i UCS-2/UTF-16 można łatwo odróżnić za pomocą znaku kolejności bajtów na początku pliku. Jeśli to istnieje, to całkiem niezły zakład, że plik jest w tym kodowaniu - ale nie jest to martwa pewność. Może się również okazać, że plik znajduje się w jednym z tych kodowań, ale nie ma znaku kolejności bajtów.

Nie wiem zbyt wiele o ISO-8859 - 2, ale nie zdziwiłbym się, gdyby prawie każdy plik był prawidłowym plikiem tekstowym w tym kodowaniu. Najlepsze, co możesz zrobić, to sprawdź heurystycznie. Rzeczywiście, Strona Wikipedii mówiąca o tym sugeruje, że tylko bajt 0x7f jest nieprawidłowy.

Nie ma pomysłu na odczytanie pliku "tak jak jest", a jednak pobranie tekstu - plik jest sekwencją bajtów, więc musisz zastosować kodowanie znaków, aby dekodować te bajty na znaki.

Source by stackoverflow

 0
Author: brijesh k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-27 08:00:52