Jak poprawnie ustawić domyślnie kodowanie znaków używane przez JVM (1.5.x) programowo?
Przeczytałem, że -Dfile.encoding=whatever
kiedyś była to droga do starszych JVM. Nie mam tego luksusu z powodów, dla których nie chcę.
Próbowałem:
System.setProperty("file.encoding", "UTF-8");
I właściwość zostaje ustawiona, ale nie wydaje się, aby powodowała, że ostatnie getBytes
wywołanie poniżej używa 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());
java
utf-8
character-encoding
Willi Mentzel
źródło
źródło
file.encoding
właściwości nie jest obsługiwane .class Reader
&class Writer
)? Ponieważclass FileInputStream
jest to strumień I / O oparty na bajtach, dlaczego więc należy przejmować się zestawem znaków w strumieniu I / O opartym na bajtach?Odpowiedzi:
Niestety
file.encoding
właściwość należy określić podczas uruchamiania maszyny JVM; do czasu wprowadzenia głównej metody kodowania znaków używanego przezString.getBytes()
domyślnych konstruktorówInputStreamReader
i naOutputStreamWriter
stałe zapisywanych w pamięci podręcznej.Jak zauważa Edward Grech, w takim szczególnym przypadku
JAVA_TOOL_OPTIONS
można użyć zmiennej środowiskowej, aby określić tę właściwość, ale zwykle robi się tak:Charset.defaultCharset()
będzie odzwierciedlać zmiany wefile.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 zapytać o
file.encoding
właściwość lubCharset.defaultCharset()
znaleźć bieżące domyślne kodowanie i użyć odpowiedniej metody lub przeciążenia konstruktora, aby je określić.źródło
file.encoding
sysprop po uruchomieniu JVM.Z dokumentacji interfejsu narzędzia JVM ™ …
Po ustawieniu zmiennej środowiskowej (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ł pobrany, ponieważ następujący komunikat zostanie wysłany doSystem.err
:źródło
UTF8
czyUTF-8
?Mam hacky sposób, który zdecydowanie działa !!
W ten sposób oszukasz JVM, który uznałby, że zestaw znaków nie jest ustawiony, i sprawi, że będzie ustawiony ponownie na UTF-8, w czasie wykonywania!
źródło
WARNING: An illegal reflective access operation has occurred • WARNING: Illegal reflective access by [..] • WARNING: Please consider reporting this to the maintainers of [..] • WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations • WARNING: All illegal access operations will be denied in a future release
Myślę, że lepszym podejściem niż ustawienie domyślnego zestawu znaków platformy, zwłaszcza że wydaje się, że masz ograniczenia w wpływie na wdrażanie aplikacji, nie mówiąc już o platformie, jest wywoływanie 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 to być przestarzałe, ponieważ spowodowało to poważne problemy w wielu przypadkach, w których widziałem, w których deweloper nie uwzględnił domyślnego zestawu znaków, który może się zmienić.źródło
Nie mogę odpowiedzieć na twoje pierwotne pytanie, ale chciałbym zaoferować ci kilka rad - nie zależą od domyślnego kodowania JVM. Zawsze najlepiej jest wyraźnie określić pożądane kodowanie (tj. „UTF-8”) w kodzie. W ten sposób wiesz, że będzie działać nawet w różnych systemach i konfiguracjach JVM.
źródło
Spróbuj tego :
źródło
Mieliśmy te same problemy. Metodycznie wypróbowaliśmy kilka sugestii z tego artykułu (i innych), ale bezskutecznie. Próbowaliśmy także dodać
-Dfile.encoding=UTF8
i nic nie działało.Dla osób, które mają ten problem, następujący artykuł w końcu pomógł nam wyśledzić opisuje jak ustawienie regionalne mogą się złamać
unicode/UTF-8
wJava/Tomcat
http://www.jvmhost.com/articles/locale-breaks-unicode-utf-8-java-tomcat
Prawidłowe ustawienie regionalne w
~/.bashrc
pliku działało dla nas.źródło
Próbowałem wielu rzeczy, ale przykładowy kod tutaj działa idealnie. Połączyć
Sedno kodu to:
źródło
Jeśli używasz Spring Boot i chcesz przekazać argument
file.encoding
w JVM, musisz go uruchomić w następujący sposób:było nam to potrzebne, ponieważ korzystaliśmy z
JTwig
szablonów i system operacyjny miałANSI_X3.4-1968
to sprawdziłSystem.out.println(System.getProperty("file.encoding"));
Mam nadzieję, że to komuś pomoże!
źródło
Używam elastycznej fasoli Amazon (AWS) i pomyślnie zmieniłem ją na UTF-8.
W Elastic Beanstalk przejdź do Konfiguracja> Oprogramowanie, „Właściwości środowiska”. Dodaj (nazwa) JAVA_TOOL_OPTIONS z (wartość) -Dfile.encoding = UTF8
Po zapisaniu środowisko uruchomi się ponownie z kodowaniem UTF-8.
źródło
Nie jest jasne, co robisz i nie masz nad tym kontroli. Jeśli możesz wstawić inną klasę OutputStream do pliku docelowego, możesz użyć podtypu OutputStream, który konwertuje ciągi znaków na bajty pod zdefiniowanym przez ciebie zestawem znaków, domyślnie UTF-8. Jeśli zmodyfikowany UTF-8 jest wystarczający dla twoich potrzeb, możesz użyć
DataOutputStream.writeUTF(String)
:Jeśli takie podejście nie jest wykonalne, może pomóc wyjaśnienie tutaj dokładnie tego, co możesz, a czego nie możesz kontrolować, pod względem przepływu danych i środowiska wykonywania (choć wiem, że czasem łatwiej to powiedzieć niż ustalić). Powodzenia.
źródło
polecenie działało z wtyczką exec-maven w celu rozwiązania następującego błędu podczas konfigurowania zadania Jenkins.
źródło
Ustawiamy tam dwie właściwości systemu, dzięki czemu system bierze wszystko do utf8
źródło
Po komentarzu @Caspar na temat zaakceptowanej odpowiedzi preferowanym sposobem rozwiązania tego problemu według firmy Sun jest:
„zmień ustawienia regionalne platformy bazowej przed uruchomieniem programu Java”.
http://bugs.java.com/view_bug.do?bug_id=4163515
W przypadku dokera zobacz:
http://jaredmarkell.com/docker-and-locales/
źródło
Niedawno wpadłem na system Notes 6.5 lokalnej firmy i dowiedziałem się, że poczta internetowa wyświetla znaki, których nie można zidentyfikować podczas instalacji systemu Windows w środowisku innym niż Zhongwen. Kopałem przez kilka tygodni online, odkryłem to zaledwie kilka minut temu:
We właściwościach Java dodaj następujący ciąg do parametrów środowiska wykonawczego
W tym przypadku ustawienie UTF-8 nie działałoby.
źródło
Mój zespół napotkał ten sam problem na komputerach z systemem Windows .. następnie udało się go rozwiązać na dwa sposoby:
a) Ustaw zmienną środowiskową (nawet w preferencjach systemu Windows)
JAVA_TOOL_OPTIONS
-Dfile.encoding = UTF8
b) Wprowadź następujący fragment kodu do pliku pom.xml:
W CIĄGU
źródło