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());
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ć.
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
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!
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ę.
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.
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"))
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ł.
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");
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!
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.
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)
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
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:
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.
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.
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