Ustawianie domyślnego kodowania znaków Java?

Jak poprawnie ustawić domyślne kodowanie znaków używane przez JVM (1.5.x) programowo?

Czytałem, że -Dfile.encoding=whatever kiedyś był sposób, aby przejść do starszych JVMs... Nie mam tego luksusu z powodów, w które nie chcę się pakować.

Próbowałem:

System.setProperty("file.encoding", "UTF-8");

I właściwość zostaje ustawiona, ale nie wydaje się, aby końcowe wywołanie getBytes poniżej używało UTF8:

    System.setProperty("file.encoding", "UTF-8");

    byte inbytes[] = new byte[1024];

    FileInputStream fis = new FileInputStream("response.txt");
    fis.read(inbytes);
    FileOutputStream fos = new FileOutputStream("response-2.txt");
    String in = new String(inbytes, "UTF8");
    fos.write(in.getBytes());
Author: Bhavik Ambani, 2008-12-12

15 answers

Niestety, Właściwość file.encoding musi być określona podczas uruchamiania JVM; do czasu wprowadzenia głównej metody kodowanie znaków używane przez String.getBytes() i domyślne konstruktory InputStreamReader i OutputStreamWriter zostały trwale zbuforowane.

Jak zauważa Edward Grech, w takim szczególnym przypadku zmienna środowiskowa JAVA_TOOL_OPTIONS można użyć do określenia tej właściwości, ale zwykle robi się to tak:

java -Dfile.encoding=UTF-8 … com.x.Main

Charset.defaultCharset() będzie odzwierciedlać zmiany w file.encoding właściwości, ale większość kodu w podstawowych bibliotekach Java, które muszą określić domyślne kodowanie znaków, nie korzysta z tego mechanizmu.

Podczas kodowania lub dekodowania, możesz odpytywać właściwość file.encoding lub Charset.defaultCharset(), aby znaleźć bieżące domyślne kodowanie i użyć odpowiedniej metody lub konstruktora, aby je określić.

 261
Author: erickson,
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:54:46

Z interfejsu narzędzia JVM™ dokumentacja ...

Ponieważ wiersz poleceń nie zawsze może być dostępny lub modyfikowany, na przykład w maszynach wirtualnych osadzonych lub po prostu maszynach wirtualnych uruchomionych głęboko w skryptach, dostarczana jest zmienna JAVA_TOOL_OPTIONS, aby w takich przypadkach można było uruchomić agentów.

Ustawiając zmienną środowiskową (Windows) JAVA_TOOL_OPTIONS na -Dfile.encoding=UTF8, właściwość (Java) System będzie ustawiana automatycznie przy każdym uruchomieniu JVM. Będziesz wiedział, że parametr został odebrano, ponieważ na System.err zostanie wysłana następująca wiadomość:

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8

 154
Author: Edward Grech,
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-03-08 04:46:37

Mam hacky sposób, który zdecydowanie działa!!

System.setProperty("file.encoding","UTF-8");
Field charset = Charset.class.getDeclaredField("defaultCharset");
charset.setAccessible(true);
charset.set(null,null);

W ten sposób oszukasz JVM, który pomyśli, że charset nie jest ustawiony i sprawi, że ustawisz go ponownie na UTF-8 w trybie runtime!

 55
Author: naskoos,
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
2013-03-22 10:16:57

Myślę, że lepszym podejściem niż ustawienie domyślnego zestawu znaków Platformy, zwłaszcza, że wydaje się, że masz ograniczenia dotyczące wdrażania aplikacji, nie mówiąc już o platformie, jest wywołanie znacznie bezpieczniejszego String.getBytes("charsetName"). W ten sposób Twoja aplikacja nie jest zależna od rzeczy poza jej kontrolą.

Osobiście uważam, że String.getBytes() powinno być przestarzałe, ponieważ spowodowało to poważne problemy w wielu przypadkach, które widziałem, gdzie deweloper nie uwzględnił domyślnego charset prawdopodobnie zmieniam się.

 36
Author: Dov Wasserman,
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-03-30 14:15:10

Nie mogę odpowiedzieć na twoje pierwotne pytanie, ale chciałbym ci doradzić -- nie polegaj na domyślnym kodowaniu JVM. Zawsze najlepiej jest wyraźnie określić żądane kodowanie (np. "UTF-8") w kodzie. W ten sposób wiesz, że będzie działać nawet w różnych systemach i konfiguracjach JVM.

 17
Author: Marc Novakowski,
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-12-12 05:36:04

Spróbuj tego:

    new OutputStreamWriter( new FileOutputStream("Your_file_fullpath" ),Charset.forName("UTF8"))
 12
Author: Emmanuel.B,
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
2012-01-20 18:09:42

Mieliśmy te same problemy. Metodycznie wypróbowaliśmy kilka sugestii z tego artykułu (i innych) bez skutku. Próbowaliśmy również dodać-Dfile.encoding = UTF8 i nic nie działało.

Dla osób, które mają ten problem, poniższy artykuł w końcu pomógł nam znaleźć opis, w jaki sposób ustawienie regionalne może złamać unicode / UTF-8 w Javie / Tomcat

Http://www.jvmhost.com/articles/locale-breaks-unicode-utf-8-java-tomcat

Ustawianie locale poprawnie w~/.plik bashrc zadziałał.

 5
Author: D Bright,
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-01-09 00:46:28

Próbowałem wielu rzeczy, ale przykładowy kod tutaj działa idealnie. Link

Sednem kodu jest:

String s = "एक गाव में एक किसान";
String out = new String(s.getBytes("UTF-8"), "ISO-8859-1");
 3
Author: Lavixu,
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
2016-01-03 16:15:57

Jeśli używasz Spring Boot i chcesz przekazać argument file.encoding w JVM musisz uruchomić go w ten sposób:

mvn spring-boot:run -Drun.jvmArguments="-Dfile.encoding=UTF-8"

To było nam potrzebne, ponieważ korzystaliśmy z szablonów JTwig, a system operacyjny miał ANSI_X3.4-1968, o czym dowiedzieliśmy się przez System.out.println(System.getProperty("file.encoding"));

Mam nadzieję, że to komuś pomoże!

 3
Author: Michail Michailidis,
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
2018-02-23 17:01:53

Nie wiem, co robisz i nie masz nad tym kontroli. Jeśli możesz wprowadzić inną klasę OutputStream do pliku docelowego, możesz użyć podtypu OutputStream, który konwertuje ciągi znaków na bajty w zdefiniowanym zestawie znaków, np. domyślnie UTF-8. Jeśli zmodyfikowany UTF-8 jest odpowiedni dla Twoich potrzeb, możesz użyć DataOutputStream.writeUTF(String):

byte inbytes[] = new byte[1024];
FileInputStream fis = new FileInputStream("response.txt");
fis.read(inbytes);
String in = new String(inbytes, "UTF8");
DataOutputStream out = new DataOutputStream(new FileOutputStream("response-2.txt"));
out.writeUTF(in); // no getBytes() here

Jeśli takie podejście nie jest wykonalne, może pomóc, jeśli wyjaśnisz tutaj dokładnie, co możesz, a czego nie możesz kontrolować pod względem przepływu danych i wykonania Środowiska (choć wiem, że czasem łatwiej powiedzieć niż określić). Powodzenia.

 1
Author: Dov Wasserman,
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-12-16 03:59:32
mvn clean install -Dfile.encoding=UTF-8 -Dmaven.repo.local=/path-to-m2

Polecenie działało z exec-maven-plugin, aby rozwiązać następujący błąd podczas konfigurowania zadania jenkins.

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m; support was removed in 8.0
Error occurred during initialization of VM
java.nio.charset.IllegalCharsetNameException: "UTF-8"
    at java.nio.charset.Charset.checkName(Charset.java:315)
    at java.nio.charset.Charset.lookup2(Charset.java:484)
    at java.nio.charset.Charset.lookup(Charset.java:464)
    at java.nio.charset.Charset.defaultCharset(Charset.java:609)
    at sun.nio.cs.StreamEncoder.forOutputStreamWriter(StreamEncoder.java:56)
    at java.io.OutputStreamWriter.<init>(OutputStreamWriter.java:111)
    at java.io.PrintStream.<init>(PrintStream.java:104)
    at java.io.PrintStream.<init>(PrintStream.java:151)
    at java.lang.System.newPrintStream(System.java:1148)
    at java.lang.System.initializeSystemClass(System.java:1192)
 1
Author: prabushi samarakoon,
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
2018-03-06 08:28:28

Ustawiamy tam dwie właściwości systemu razem i sprawia to, że system bierze wszystko do utf8

file.encoding=UTF8
client.encoding.override=UTF-8
 0
Author: lizi,
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
2012-01-19 19:23:40

Po komentarzu @ Caspar na zaakceptowaną odpowiedź, preferowanym sposobem naprawienia tego według Sun jest:

" zmień ustawienia regionalne podstawowej platformy przed uruchomieniem programu Java."

Http://bugs.java.com/view_bug.do?bug_id=4163515

Docker zobacz:

Http://jaredmarkell.com/docker-and-locales/

 0
Author: Luis Muñoz,
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-10-05 15:40:32

Ostatnio wpadłem na system Notes 6.5 lokalnej firmy i dowiedziałem się, że webmail będzie wyświetlał niezidentyfikowane znaki na zainstalowanym systemie Windows bez Zhongwen. Kopałem przez kilka tygodni w Internecie, zorientowałem się kilka minut temu:

We właściwościach Java Dodaj następujący ciąg do parametrów Runtime

-Dfile.encoding=MS950 -Duser.language=zh -Duser.country=TW -Dsun.jnu.encoding=MS950

Ustawienie UTF-8 nie zadziała w tym przypadku.

 0
Author: midmaestro,
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-10-14 17:14:47

Używam Amazon (AWS) Elastic Beanstalk i z powodzeniem zmieniłem go na UTF-8.

W Elastic Beanstalk przejdź do Konfiguracja > oprogramowanie, "właściwości środowiska". Dodaj (nazwa) JAVA_TOOL_OPTIONS za pomocą (wartość) - Dfile.encoding = UTF8

Po zapisaniu środowisko uruchomi się ponownie z kodowaniem UTF-8.

 0
Author: Berend Menninga,
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
2018-04-24 08:59:03