Java'da "kodlama için eşlenemeyen karakter" uyarısı


113

Şu anda, derlediğimde aşağıdaki uyarıyı veren bir Java projesi üzerinde çalışıyorum:

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

SO'nun karakteri tarihten önce nasıl oluşturacağından emin değilim, ancak bir telif hakkı sembolü olmalı ve uyarıda bir elmas içinde soru işareti olarak gösteriliyor.

Karakterin çıktı yapıtında doğru bir şekilde göründüğünü belirtmek gerekir, ancak uyarılar bir sıkıntıdır ve bu sınıfı içeren dosyaya bir gün kodlamayı yanlış kaydeden bir metin düzenleyicisi tarafından dokunulabilir ...

Derleyicinin mutlu olması ve sembolün olası yeniden kodlama sorunları olmadan dosyada korunması için bu karakteri "telif hakkı" dizesine nasıl ekleyebilirim?


aslında bu telif hakkı karakterini hangi baytların oluşturduğunu bilmekle ilgilenin, yani bir hexdump AppDBCore.javaşekilde \u00a9ondan şüpheliyim ve bunun yerine sistem kurulumunuz nedeniyle kısmen sizin için işe yarayan bir şey. Yukarıdaki soru işareti , değeri bilinmeyen veya Unicode hexutf8.com/… 'de
jar

Yanıtlar:


56

"\ Uxxxx" çıkış biçimini kullanın.

Wikipedia'ya göre , telif hakkı simgesi unicode U + 00A9'dur, bu nedenle satırınız şöyle olmalıdır:

String copyright = "\u00a9 2003-2008 My Company. All rights reserved.";

13
Karakterlere \ uNNNN dikkat edin ... sözcüksel analiz yapmadan önce ayrıştırılırlar. Örneğin, bu / * c: \ unit * / açıklamasını kodunuza eklerseniz, artık derlenmeyecektir çünkü "nit" doğru onaltılık sayı değildir.
Peter Štibraný

3
Kesinlikle. (Bu, unicode kaçışının yalnızca belirli bağlamlarda uygulandığı C # 'da daha iyi işlenir - ama sonra tehlikeli bir kaçış dizisi de var, bu korkunç.)
Jon Skeet

5
Bu, tedaviden çok yara bandına benziyor. Gerçek sorun, javac'a kaynak dosyaları gerçekten ISO-8859-1 veya windows-1252 gibi tek baytlık kodlamadayken UTF-8'de beklemesini söylemeniz gibi görünüyor.
Alan Moore

6
@Alan M: Tecrübelerime göre, kaynak dosyalarını ASCII'de tutarak bir problem yaşamayacağınızdan emin olmak , kaynağınızın derlendiği her yerde doğru kodlamayı kullandığınızdan emin olmaktan çok daha kolaydır (Ant, Eclipse, FİKİR vb.).
Jon Skeet

6
@Jon, bu Java'daki temel bir kusur; Java kaynak biriminin UTF-8, ISO 8859-1, CP1252, MacRoman veya herhangi bir şekilde kodlanmış olması, ihtiyaç duyan kaynak birimin dışındaki meta verilerde işlenir. Bu sizi karınca dosyanızı veya Eclipse yapılandırmanızı vb. Düzeltmeyi hatırlamaya zorlar. Haklı olarak işaret ettiğiniz gibi, bu kesinlikle bunu yapmanın en kötü yoludur, çünkü bilgi kırılgandır ve kolayca kaybolur. Metadata (metadata kodlama) ve veriyi (okuma: kaynak kodu) tek bir yerde bir arada tutan diller bu konuda çok daha sağlamdır. Tek mantıklı yaklaşım bu.
tchrist

91

Şununla deneyin: javac - kodlama ISO-8859-1 dosya_adı.java


1
Bu çözümü beğendim. "-Encoding UTF-8" i bir compilerarg olarak ant build.xml dosyama ekledim ve hala "uyarı: ASCII'yi kodlamak için eşlenemez karakter" alıyorum. Eğer onu "-encoding jjjj" olarak değiştirirsem, derleme yapmaz, "hata: desteklenmeyen kodlama: jjjj" şikayet eder, bu yüzden UTF-8'i tanıdığını biliyorum, ancak yine de .java dosyalarına ascii olarak davranılıyor gibi görünüyor. İç çekmek.
dfrankow

1
Ant javac görevinin "kodlama" parametresini denedim, aynı problem. Parametreyi tanır, ancak daha sonra bir şekilde yok sayar.
dfrankow

20
@dfrankow: Dosyanıza ilgili çağrının <compilerarg line="-encoding utf-8"/>altına eklemeniz <javac>gerekir Build.xml. Bu, bunu yapmanın kötü bir yolu, ama seçeneğin yok. En üstteki uzun yorumuma bakın.
tchrist

Compilearg'ı karınca betiğine eklediğimde de aynı problemi yaşadım, işe yaradı, bunu bir Windows komut satırından oluşturuyordum, tuhaf olan şu ki, tutulmadan inşa ediyordum, derlemeden kurtuldu, sanki tutulma önemsiyor gibi görünüyor doğru kodlama.
simonC

Bu bana yardımcı oldu :) MAC OSX için
Arun Abraham

44

Maven kullanıyorsanız <encoding>, derleyici eklentisinin yapılandırmasında açıkça ayarlayın , örn.

<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>

İnsanlar projelerini oluşturmak için maven kullanıyorsa, paylaştığınız için teşekkürler, bu doğru yaklaşımdır.
Shamik

2
Javadoc eklentisi, eşleştirilemeyen karakterden de şikayet edecek. project.build.sourceEncodingÖzelliği ayarlamak tercih edilir .
Emmanuel Bourg

zaten project.build.sourceEncoding özelliğini kullanıyordum, ancak bir şekilde derleyici kodlama özelliğine düzgün şekilde eşlenmedi. Bunu açıkça belirlemek hile yaptı
Federico Bonelli

32

Bu bana yardımcı oldu:

Tek yapmanız gereken, JAVA_TOOL_OPTIONS adında bir ortam değişkeni belirlemektir. Bu değişkeni -Dfile.encoding = UTF8 olarak ayarlarsanız, bir JVM her başlatıldığında bu bilgiyi alır.

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


wow işe yarıyor Bunu .bashrc dosyama ekledim ve sorunumu çözdü.
cowboi-peng

Oluşturmak için girdiğim komut satırından harika çalıştı: javac MyJavaFile.java -encoding utf-8 -cp .;lib\*Sonra çalıştırırken, o ekstra kodlama parçasını eklememe gerek kalmadı.
Azurespot

23

bu satırı Java conf'in üzerine .gradle dosyanıza koyun.

apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}   

Bunun için compileTestJavave için javadocde kodlamayı ayarlamak isteyebilirsiniz
Frank Neblung

8

Bu derleme hatası çoğu zaman unicode (UTF-8 kodlu) dosya derlerken ortaya çıkar

javac -encoding UTF-8 HelloWorld.java

ve ayrıca bu derleme seçeneğini IDE ex: Intellij fikrinize
ekleyebilirsiniz (Dosya> ayarlar> Java Derleyici) ek komut satırı parametresi olarak ekleyin

görüntü açıklamasını buraya girin

-encoding: encoding EUC-JP ve UTF-8 gibi kaynak dosya kodlama adını ayarlayın. -encoding belirtilmezse, platformun varsayılan dönüştürücüsü kullanılır. ( DOC )


8

Gradle Adımları

Gradle kullanıyorsanız, java eklentisini uygulayan satırı bulabilirsiniz:

apply plugin: 'java'

Ardından, derleme görevinin kodlamasını UTF-8 olarak ayarlayın:

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

Birim testleriniz varsa, muhtemelen bunları da UTF-8 ile derlemek istersiniz:

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

Genel Gradle Örneği

Bu, genel gradle kodunun aşağıdaki gibi görüneceği anlamına gelir:

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

2

Bu benim için çalıştı -

    <?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>

1

Eclipse kullanırsanız (Eclipse, utf8 karakteri yazsanız bile sizin için utf8 kodu koyabilir. Programlarken normal utf8 karakterini göreceksiniz ancak arka plan utf8 kodu olacaktır);

  1. Proje Seçiniz
  2. Sağ tıklayın ve Özellikler'i seçin
  3. Seç Kaynak üzerinde Kaynak Paneli (2 sonra açılan sağ menünün Üst)
  4. Sen görebilirsiniz Kaynak Paneli , Metin Dosyası Kodlama , istediğiniz hangi başka seç

Not: Kodda statik bir değer alırsanız bu tamam olacaktır. Örnek için String testi = "İİİİİııııııççççç";


1
"Programlama [yaparken] normal [a] utf8 karakterini göreceksiniz, ancak [] arka planı utf8 kodu olacak" açıklamanız bir anlam ifade etmiyor. Ayrıca, yukarıdaki soruya cevaben uzun yorumuma bakın.
tchrist

Bunu ISO-8859-1 olarak değiştirdim, ancak yine de "UTF8'i kodlamak için eşlenemeyen karakter" hakkında bir derleme hatası alıyorum.
pacoverflow

1

Java hata mesajında ​​belirtilen karakter dizininin yanlış olduğu aynı sorunu yaşadım. Bunu, rapor edilen konumun onaltılık 022 yerine onaltılık 094 (tırnak yerine iptal, ancak alıntı olarak temsil edilir) olmasından hemen önce çift tırnak karakterlerine daralttım. Onaltılı 022 varyantıyla değiştirir değiştirmez her şey yolunda gitti.


1

Komut isteminden Maven Build kullanılıyorsa, aşağıdaki komutu da kullanabilirsiniz:

                    mvn -Dproject.build.sourceEncoding=UTF-8

1

Bunun neden bazı sistemlerde meydana geldiğini ve diğerlerinde olmadığını merak edenler için (aynı kaynakla, derleme parametreleri vb.), Ortam değişkeninizi kontrol edinLANG . Uyarı / hatayı ne zaman alıyorum LANG=C.UTF-8ama ne zaman almıyorum LANG=en_US.UTF-8.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.