Peringatan “karakter yang tidak dapat dipetakan untuk encoding” di Java

112

Saya sedang mengerjakan proyek Java yang mengeluarkan peringatan berikut ketika saya mengkompilasi:

/src/com/myco/apps/AppDBCore.java:439: warning: unmappable character for encoding UTF8
    [javac]         String copyright = "� 2003-2008 My Company. All rights reserved.";

Saya tidak yakin bagaimana SO akan membuat karakter sebelum tanggal, tetapi itu harus menjadi simbol hak cipta, dan ditampilkan dalam peringatan sebagai tanda tanya di berlian.

Perlu dicatat bahwa karakter tersebut muncul dalam artefak keluaran dengan benar, tetapi peringatannya merupakan gangguan dan file yang berisi kelas ini suatu hari nanti dapat disentuh oleh editor teks yang menyimpan pengkodean secara tidak benar ...

Bagaimana cara menyuntikkan karakter ini ke string "hak cipta" sehingga kompilator senang, dan simbol tersebut dipertahankan dalam file tanpa potensi masalah pengkodean ulang?

seanhodges
sumber
tertarik untuk benar-benar mengetahui byte apa yang membentuk karakter hak cipta itu, yaitu hexdump AppDBCore.javaentah bagaimana saya meragukannya \u00a9dan sebaliknya adalah sesuatu yang berfungsi sebagian untuk Anda karena pengaturan sistem Anda. Tanda tanya di atas digunakan untuk menggantikan karakter masuk yang nilainya tidak diketahui atau tidak dapat direpresentasikan
jar

Jawaban:

56

Gunakan format pelolosan "\ uxxxx".

Menurut Wikipedia , simbol hak cipta adalah unicode U + 00A9 sehingga baris Anda harus membaca:

String copyright = "\u00a9 2003-2008 My Company. All rights reserved.";
Jon Skeet
sumber
13
Hati-hati dengan \ uNNNN karakter ... mereka diurai sebelum melakukan analisis leksikal. Misalnya, jika Anda meletakkan komentar ini / * c: \ unit * / ke kode Anda, itu tidak akan dapat dikompilasi lagi, karena "nit" bukanlah nomor hex yang benar.
Peter Štibraný
3
Benar. (Ini lebih baik ditangani di C #, di mana pelolosan unicode hanya diterapkan dalam konteks tertentu - tetapi kemudian ada urutan pelarian \ x yang berbahaya juga, yang mengerikan.)
Jon Skeet
5
Ini terdengar lebih seperti plester daripada obat. Masalah sebenarnya tampaknya Anda memberi tahu javac untuk mengharapkan file sumber dalam UTF-8 ketika mereka benar-benar dalam pengkodean byte tunggal seperti ISO-8859-1 atau windows-1252.
Alan Moore
6
@Alan M: Menurut pengalaman saya, jauh lebih mudah untuk memastikan Anda tidak akan mengalami masalah dengan menyimpan file sumber di ASCII daripada memastikan Anda menggunakan pengkodean yang benar di mana pun sumber Anda mungkin dikompilasi (Ant, Eclipse, IDEA dll).
Jon Skeet
6
@Jon, itu kelemahan mendasar di Jawa; fakta bahwa unit sumber Java dienkode dalam UTF-8, ISO 8859-1, CP1252, MacRoman, atau apa pun, diperlakukan pada metadata di luar unit sumber yang membutuhkannya. Ini memaksa Anda untuk mengingat untuk memperbaiki file ant atau konfigurasi Eclipse, dll. Seperti yang Anda tunjukkan dengan benar, ini benar-benar cara terburuk untuk melakukannya, karena infonya rapuh dan mudah hilang. Bahasa yang menyatukan metadata (encoding metadata) dan data (baca: kode sumber) di satu tempat jauh lebih kuat dalam hal ini. Ini satu-satunya pendekatan yang waras.
tchrist
91

Coba dengan: javac -encoding ISO-8859-1 file_name.java

Fernando Nah
sumber
1
Saya suka solusi ini. Saya menambahkan "-encoding UTF-8" sebagai compilerarg di ant build.xml saya dan saya masih mendapatkan "peringatan: karakter tidak dapat dipetakan untuk encoding ASCII". Jika saya memodifikasinya menjadi "-encoding jjjj", ia tidak akan dapat dikompilasi, mengeluh "error: encoding tidak didukung: jjjj", jadi saya tahu ia mengenali UTF-8, tetapi tampaknya file .java masih diperlakukan sebagai ascii. Mendesah.
dfrankow
1
Saya mencoba parameter "encoding" dari tugas semut javac, masalah yang sama. Itu mengenali parameter, tapi kemudian mengabaikannya entah bagaimana.
dfrankow
20
@dfrankow: Anda harus menambahkan di <compilerarg line="-encoding utf-8"/>bawah <javac>panggilan yang berlaku di Build.xmlfile Anda . Ini cara yang buruk untuk melakukannya, tetapi Anda tidak punya pilihan. Lihat komentar panjang saya di atas.
tchrist
Saya memiliki masalah yang sama ketika saya menambahkan compilearg dalam skrip semut itu bekerja ok, saya membangun ini dari windows comandline, anehnya adalah bahwa saya membangun dari gerhana itu warked eaven tanpa compilearg, sepertinya gerhana itu peduli hak pengkodean.
simonC
Ini membantu saya :) untuk MAC OSX
Arun Abraham
44

Jika Anda menggunakan Maven, setel <encoding>secara eksplisit dalam konfigurasi plugin compiler, mis

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
Thomas Leonard
sumber
Ini adalah pendekatan yang tepat jika orang menggunakan maven untuk membangun proyek mereka, terima kasih telah berbagi.
Shamik
2
Plugin javadoc juga akan mengeluh tentang karakter yang tidak dapat diterapkan. Lebih baik mengatur project.build.sourceEncodingproperti.
Emmanuel Bourg
Saya sudah menggunakan properti project.build.sourceEncoding, tetapi entah bagaimana properti itu tidak dipetakan dengan benar ke dalam properti encoding compiler. Pengaturan itu secara eksplisit berhasil
Federico Bonelli
32

Ini membantu saya:

Yang perlu Anda lakukan adalah menentukan variabel envirnoment yang disebut JAVA_TOOL_OPTIONS. Jika Anda menyetel variabel ini ke -Dfile.encoding = UTF8, setiap kali JVM dimulai, ia akan mengambil informasi ini.

Sumber: http://whatiscomingtomyhead.wordpress.com/2012/01/02/get-rid-of-unmappable-character-for-encoding-cp1252-once-and-for-all/

nightlyop
sumber
wow berhasil. Saya hanya menambahkan ini ke .bashrc saya, dan itu memperbaiki masalah saya.
cowboi-peng
Berhasil, dari baris perintah yang saya masukkan untuk membangun: javac MyJavaFile.java -encoding utf-8 -cp .;lib\*Kemudian saat menjalankannya, saya tidak perlu menambahkan bagian pengkodean tambahan itu.
Azurespot
23

letakkan baris ini di file .gradle yor di atas konfigurasi Java.

apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}   
Alobes5
sumber
Anda mungkin ingin menyetel pengkodean untuk compileTestJavadan untuk javadocjuga
Frank Neblung
8

Sering kali, kesalahan kompilasi ini terjadi ketika kompilasi file unicode (berenkode UTF-8)

javac -encoding UTF-8 HelloWorld.java

dan juga Anda dapat menambahkan opsi kompilasi ini ke IDE Anda misalnya: Ide Intellij
(File> pengaturan> Java Compiler) tambahkan sebagai parameter baris perintah tambahan

masukkan deskripsi gambar di sini

-encoding: encoding Setel nama pengkodean file sumber, seperti EUC-JP dan UTF-8 .. Jika -encoding tidak ditentukan, konverter default platform akan digunakan. ( DOC )

Alupota
sumber
8

Langkah Gradle

Jika Anda menggunakan Gradle, Anda dapat menemukan baris yang menerapkan plugin java:

apply plugin: 'java'

Kemudian setel encoding untuk tugas kompilasi menjadi UTF-8:

compileJava {options.encoding = "UTF-8"}   

Jika Anda memiliki pengujian unit, Anda mungkin ingin mengkompilasinya dengan UTF-8 juga:

compileTestJava {options.encoding = "UTF-8"}

Contoh Gradle Keseluruhan

Artinya, keseluruhan kode gradle akan terlihat seperti ini:

apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}
compileTestJava {options.encoding = "UTF-8"}
Luke Machowski
sumber
2

Ini berhasil untuk saya -

    <?xml version="1.0" encoding="utf-8" ?>
<project name="test" default="compile">
    <target name="compile">
        <javac srcdir="src" destdir="classes" 
                           encoding="iso-8859-1" debug="true" />
    </target>
</project>
Dxx0
sumber
1

Jika Anda menggunakan eclipse (Eclipse dapat memberikan kode utf8 untuk Anda meskipun Anda menulis karakter utf8. Anda akan melihat karakter utf8 normal ketika Anda memprogram tetapi latar belakangnya adalah kode utf8);

  1. Pilih Proyek
  2. Klik kanan dan pilih Properties
  3. Pilih Resource di Resource Panel (Atas menu kanan yang dibuka setelah 2.)
  4. Anda dapat melihat di Resource Panel , Text File Encoding , pilih yang lain yang Anda inginkan

PS: ini akan ok jika Anda nilai statis dalam kode. Untuk Contoh Tes string = "İİİİİııııııççççç";

baybora.oren
sumber
1
Deskripsi Anda tentang "Anda akan melihat karakter [a] utf8 normal saat Anda memprogram tetapi latar belakangnya adalah kode utf8" tidak masuk akal. Juga, lihat komentar panjang saya sebagai jawaban atas pertanyaan di atas.
tchrist
Saya mengubahnya menjadi ISO-8859-1, tetapi masih mendapat kesalahan kompilasi tentang "karakter yang tidak dapat dipetakan untuk pengkodean UTF8".
pacoverflow
1

Saya mengalami masalah yang sama, di mana indeks karakter yang dilaporkan dalam pesan kesalahan java salah. Saya mempersempitnya menjadi karakter kutip ganda sebelum posisi yang dilaporkan menjadi hex 094 (batalkan bukan kutipan, tetapi direpresentasikan sebagai kutipan) bukan hex 022. Segera setelah saya menukar varian hex 022 semuanya baik-baik saja.

Kelvin Goodson
sumber
1

Jika seseorang menggunakan Maven Build dari command prompt, ia juga dapat menggunakan perintah berikut:

                    mvn -Dproject.build.sourceEncoding=UTF-8
5122014009
sumber
1

Bagi mereka yang bertanya-tanya mengapa ini terjadi pada beberapa sistem dan tidak pada yang lain (dengan sumber yang sama, parameter build, dan sebagainya), periksa LANGvariabel lingkungan Anda . Saya mendapatkan peringatan / kesalahan kapan LANG=C.UTF-8, tetapi tidak ketika LANG=en_US.UTF-8.

jakar
sumber