Bagaimana cara mengatur pengkodean karakter default yang digunakan oleh JVM (1.5.x) secara terprogram?
Saya telah membaca bahwa -Dfile.encoding=whatever
dulu cara untuk pergi untuk JVM yang lebih tua. Saya tidak memiliki kemewahan itu untuk alasan saya tidak mau masuk.
Saya telah mencoba:
System.setProperty("file.encoding", "UTF-8");
Dan properti diatur, tetapi sepertinya tidak menyebabkan getBytes
panggilan terakhir di bawah ini untuk menggunakan 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
sumber
sumber
file.encoding
properti tidak didukung .class Reader
&class Writer
)? Karenaclass FileInputStream
stream I / O berbasis byte, jadi mengapa kita harus peduli dengan set karakter dalam stream I / O berbasis byte?Jawaban:
Sayangnya,
file.encoding
properti harus ditentukan saat JVM dijalankan; pada saat metode utama Anda dimasukkan, pengkodean karakter yang digunakan olehString.getBytes()
dan konstruktor default dariInputStreamReader
danOutputStreamWriter
telah di-cache secara permanen.Seperti yang ditunjukkan Edward Grech, dalam kasus khusus seperti ini, variabel lingkungan
JAVA_TOOL_OPTIONS
dapat digunakan untuk menentukan properti ini, tetapi biasanya dilakukan seperti ini:Charset.defaultCharset()
akan mencerminkan perubahan padafile.encoding
properti, tetapi sebagian besar kode di pustaka Java inti yang perlu menentukan pengkodean karakter default tidak menggunakan mekanisme ini.Saat Anda menyandikan atau mendekode, Anda bisa menanyakan
file.encoding
properti atauCharset.defaultCharset()
menemukan encoding default saat ini, dan menggunakan metode yang sesuai atau overload konstruktor untuk menentukannya.sumber
file.encoding
sysprop setelah startup JVM.Dari dokumentasi JVM ™ Tool Interface ...
Dengan mengatur variabel lingkungan (Windows)
JAVA_TOOL_OPTIONS
ke-Dfile.encoding=UTF8
, properti (Java)System
akan diatur secara otomatis setiap kali JVM dimulai. Anda akan tahu bahwa parameter telah diambil karena pesan berikut akan dikirim keSystem.err
:sumber
UTF8
atauUTF-8
?Saya punya cara hacky yang pasti berhasil !!
Dengan cara ini Anda akan menipu JVM yang akan berpikir bahwa charset tidak disetel dan membuatnya untuk mengaturnya kembali ke UTF-8, saat runtime!
sumber
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
Saya pikir pendekatan yang lebih baik daripada pengaturan set karakter default platform, terutama karena Anda tampaknya memiliki batasan untuk mempengaruhi penyebaran aplikasi, apalagi platform, adalah untuk memanggil yang jauh lebih aman
String.getBytes("charsetName")
. Dengan begitu aplikasi Anda tidak tergantung pada hal-hal di luar kendali.Saya pribadi merasa itu
String.getBytes()
harus dihentikan, karena telah menyebabkan masalah serius dalam sejumlah kasus yang saya lihat, di mana pengembang tidak memperhitungkan charset default yang mungkin berubah.sumber
Saya tidak dapat menjawab pertanyaan awal Anda, tetapi saya ingin menawarkan beberapa saran - jangan bergantung pada penyandian standar JVM. Itu selalu terbaik untuk secara eksplisit menentukan pengkodean yang diinginkan (yaitu "UTF-8") dalam kode Anda. Dengan begitu, Anda tahu itu akan bekerja bahkan di berbagai sistem dan konfigurasi JVM.
sumber
Coba ini :
sumber
Kami mengalami masalah yang sama. Kami secara metodis mencoba beberapa saran dari artikel ini (dan lainnya) tanpa hasil. Kami juga mencoba menambahkan
-Dfile.encoding=UTF8
dan sepertinya tidak ada yang berhasil.Bagi orang-orang yang mengalami masalah ini, artikel berikut akhirnya membantu kami melacak menjelaskan bagaimana pengaturan lokal dapat mematahkan
unicode/UTF-8
diJava/Tomcat
http://www.jvmhost.com/articles/locale-breaks-unicode-utf-8-java-tomcat
Mengatur lokal dengan benar dalam
~/.bashrc
file berhasil bagi kami.sumber
Saya telah mencoba banyak hal, tetapi kode sampel di sini berfungsi dengan sempurna. Tautan
Inti dari kode ini adalah:
sumber
Jika Anda menggunakan Spring Boot dan ingin meneruskan argumen
file.encoding
di JVM Anda harus menjalankannya seperti itu:ini diperlukan bagi kami karena kami menggunakan
JTwig
template dan sistem operasiANSI_X3.4-1968
yang kami temukanSystem.out.println(System.getProperty("file.encoding"));
Semoga ini bisa membantu seseorang!
sumber
Saya menggunakan Amazon (AWS) Elastic Beanstalk dan berhasil mengubahnya menjadi UTF-8.
Di Elastic Beanstalk, buka Configuration> Software, "Properties properties". Tambahkan (nama) JAVA_TOOL_OPTIONS dengan (nilai) -Dfile.encoding = UTF8
Setelah menyimpan, lingkungan akan memulai kembali dengan pengkodean UTF-8.
sumber
Tidak jelas tentang apa yang Anda lakukan dan tidak memiliki kendali pada saat ini. Jika Anda dapat menempatkan kelas OutputStream yang berbeda pada file tujuan, Anda bisa menggunakan subtipe dari OutputStream yang mengubah Strings menjadi byte di bawah charset yang Anda tentukan, katakan UTF-8 secara default. Jika modifikasi UTF-8 memadai untuk kebutuhan Anda, Anda dapat menggunakan
DataOutputStream.writeUTF(String)
:Jika pendekatan ini tidak layak, mungkin membantu jika Anda mengklarifikasi di sini apa yang Anda bisa dan tidak bisa kendalikan dalam hal aliran data dan lingkungan eksekusi (meskipun saya tahu itu kadang-kadang lebih mudah diucapkan daripada ditentukan). Semoga berhasil.
sumber
perintah bekerja dengan exec-maven-plugin untuk mengatasi kesalahan berikut saat mengkonfigurasi tugas jenkins.
sumber
Kami mengatur di sana dua sifat sistem bersama-sama dan itu membuat sistem mengambil semuanya menjadi utf8
sumber
Mengikuti komentar @Caspar pada jawaban yang diterima, cara yang lebih disukai untuk memperbaikinya menurut Sun adalah:
"ubah lokal platform yang mendasari sebelum memulai program Java Anda."
http://bugs.java.com/view_bug.do?bug_id=4163515
Untuk buruh pelabuhan lihat:
http://jaredmarkell.com/docker-and-locales/
sumber
Baru-baru ini saya bertemu dengan sistem Catatan 6.5 perusahaan lokal dan menemukan bahwa webmail akan menunjukkan karakter yang tidak dapat diidentifikasi pada instalasi Windows lokal non-Zhongwen. Gali selama beberapa minggu online, temukan beberapa menit yang lalu:
Di properti Java, tambahkan string berikut ke Parameter Runtime
Pengaturan UTF-8 tidak akan berfungsi dalam kasus ini.
sumber
Tim saya mengalami masalah yang sama pada mesin dengan Windows .. kemudian berhasil menyelesaikannya dengan dua cara:
a) Tetapkan variabel lingkungan (bahkan dalam preferensi sistem Windows)
JAVA_TOOL_OPTIONS
-Dfile.encoding = UTF8
b) Perkenalkan cuplikan berikut ke pom.xml Anda:
DALAM
sumber