"एन्कोडिंग के लिए अनुपयुक्त चरित्र" चेतावनी जावा में


112

मैं वर्तमान में एक जावा प्रोजेक्ट पर काम कर रहा हूं जो संकलन के बाद निम्नलिखित चेतावनी को छोड़ रहा है:

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

मुझे यकीन नहीं है कि एसओ तिथि से पहले चरित्र को कैसे प्रस्तुत करेगा, लेकिन यह एक कॉपीराइट प्रतीक होना चाहिए, और चेतावनी में हीरे में एक प्रश्न चिह्न के रूप में प्रदर्शित होता है।

यह ध्यान देने योग्य है कि चरित्र आउटपुट विरूपण साक्ष्य में सही ढंग से दिखाई देता है, लेकिन चेतावनी एक उपद्रव है और इस वर्ग वाली फ़ाइल को एक दिन एक पाठ संपादक द्वारा छुआ जा सकता है जो एन्कोडिंग को गलत तरीके से बचाता है ...

मैं इस चरित्र को "कॉपीराइट" स्ट्रिंग में कैसे इंजेक्ट कर सकता हूं ताकि संकलक खुश हो, और प्रतीक को संभावित पुन: एन्कोडिंग मुद्दों के बिना फ़ाइल में संरक्षित किया जाए?


वास्तव में यह जानने में रुचि रखें कि बाइट्स उस कॉपीराइट चरित्र को कैसे बनाते हैं, यानी hexdump AppDBCore.javaमुझे किसी तरह इसके बारे में संदेह है \u00a9और इसके बजाय कुछ ऐसा है जो आपके सिस्टम सेटअप के कारण आपके लिए आंशिक रूप से काम करता है। उपरोक्त प्रश्न चिह्न का उपयोग एक आने वाले वर्ण को बदलने के लिए किया जाता है जिसका मान अज्ञात या यूनिकोड में अप्राप्य है hexutf8.com/ ...
jar

जवाबों:


56

"\ Uxxxx" भागने प्रारूप का उपयोग करें।

विकिपीडिया के अनुसार , कॉपीराइट प्रतीक यूनिकोड U + 00A9 है इसलिए आपकी पंक्ति को पढ़ना चाहिए:

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

13
\ UNNNN वर्णों के साथ सावधान रहें ... वे शाब्दिक विश्लेषण करने से पहले हैरान हैं। उदाहरण के लिए, यदि आप अपने कोड में यह टिप्पणी / * c: \ यूनिट * / डालते हैं, तो यह अब संकलित नहीं करेगा, क्योंकि "नाइट" सही हेक्स संख्या नहीं है।
पीटर attibraný

3
पूर्ण रूप से। (यह C # में बेहतर तरीके से संभाला गया है, जहां यूनिकोड से बचना केवल कुछ संदर्भों में लागू होता है - लेकिन फिर खतरनाक \ x एस्केप अनुक्रम भी है, जो भयानक है।)
जॉन स्कीट

5
यह एक इलाज की तुलना में बैंड-सहायता की तरह लगता है। वास्तविक समस्या यह प्रतीत होती है कि आप UTF-8 में स्रोत फ़ाइलों की अपेक्षा करने के लिए javac बता रहे हैं, जब वे ISO-8859-1 या विंडोज़ -1252 जैसे एकल-बाइट एन्कोडिंग में होते हैं।
एलन मूर

6
@ एलन एम: मेरे अनुभव में, यह सुनिश्चित करना बहुत आसान है कि एएससीआईआई में स्रोत फ़ाइलों को रखने से आपको कोई समस्या नहीं होगी, यह सुनिश्चित करने के लिए कि आप सही एन्कोडिंग का उपयोग करें हर जगह आपके स्रोत को संकलित किया जा सकता है (एंट, एक्लिप्स, आईडिया आदि)।
जॉन स्कीट

6
@, यह जावा में एक मौलिक दोष है; तथ्य यह है कि जावा स्रोत इकाई UTF-8, ISO 8859-1, CP1252, MacRoman, या जो कुछ भी है, में मेटाडेटा बाहरी पर स्रोत इकाई के लिए इलाज किया जाता है जिसे इसकी आवश्यकता होती है। यह आपको अपनी चींटी फ़ाइल या एक्लिप्स कॉन्फिगरेशन आदि को ठीक करने के लिए याद रखने के लिए मजबूर करता है, जैसा कि आप सही ढंग से बताते हैं, यह करने के लिए यह सबसे खराब तरीका है, क्योंकि जानकारी नाजुक और आसानी से खो जाती है। मेटाडेटा (एन्कोडिंग मेटाडेटा) और डेटा (रीड: सोर्स कोड) को एक साथ एक स्थान पर रखने वाली भाषाएँ इस पर बहुत अधिक प्रबल होती हैं। यह एकमात्र समझदार दृष्टिकोण है।
tchrist 11

91

इसके साथ प्रयास करें: javac -encoding ISO-8859-1 file_name.java


1
मुझे यह समाधान पसंद है। मैंने "चींटी UTF-8" को अपने चींटी बिल्ड.xml में एक कंपाइलरग के रूप में जोड़ा और मुझे अभी भी "चेतावनी: एएससीआईआई को एन्कोडिंग करने के लिए अयोग्य चरित्र" मिला। अगर मैं इसे "-jpg jjjj" में संशोधित करता हूँ, तो यह "त्रुटि: असमर्थित एन्कोडिंग: jjjj" को संकलित नहीं करेगा, इसलिए मुझे पता है कि यह UTF-8 को पहचान रहा है, लेकिन यह अभी भी .jpg फ़ाइलों को ascii के रूप में मानता है। आह।
dfrankow

1
मैं चींटी javac कार्य के "एन्कोडिंग" पैरामीटर की कोशिश की, वही समस्या। यह पैरामीटर को पहचानता है, लेकिन फिर इसे किसी तरह अनदेखा कर देता है।
dfrankow

20
@dfrankow: आपको अपनी फ़ाइल में <compilerarg line="-encoding utf-8"/>लागू <javac>कॉल के तहत जोड़ना होगा Build.xml। यह ऐसा करने का एक बुरा तरीका है, लेकिन आपके पास कोई विकल्प नहीं है। शीर्ष पर मेरी लंबी टिप्पणी देखें।
tchrist 11

जब मैं चींटी लिपि में काम करता था तो मुझे वही समस्या होती थी, यह ठीक काम करता था, मैं एक विंडोज़ कॉमरेडलाइन से यह बना रहा था, अजीब बात यह है कि मैं ग्रहण से बना था, इसने कंपिलगियर को उखाड़ फेंका, ऐसा लगता है कि ग्रहण थेक की देखभाल करता है एन्कोडिंग का अधिकार।
सिमोन

इसने मेरी मदद की :) मैक ओएसएक्स के लिए
अरुण अब्राहम

44

यदि आप मावेन का उपयोग कर रहे हैं, <encoding>तो संकलक प्लगइन के कॉन्फ़िगरेशन में स्पष्ट रूप से सेट करें, जैसे

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

यह सही तरीका है यदि लोग अपनी परियोजना के निर्माण के लिए मावेन का उपयोग कर रहे हैं, साझा करने के लिए धन्यवाद।
शामिक

2
Javadoc प्लगइन अयोग्य चरित्र के बारे में भी शिकायत करेगा। यह project.build.sourceEncodingसंपत्ति सेट करने के लिए बेहतर है ।
इमैनुएल बॉर्ग

मैं पहले से ही project.build.sourceEncoding संपत्ति का उपयोग कर रहा था, लेकिन किसी तरह यह संकलक एन्कोडिंग संपत्ति में ठीक से मैप नहीं किया था। इसे स्पष्ट रूप से निर्धारित करते हुए चाल
चली गई

32

इससे मुझे मदद मिली:

आपको बस इतना करना है, कि JAVA_TOOL_OPTIONS नामक एक ऊर्जावान चर को निर्दिष्ट करना है। यदि आप इस चर को -Dfile.encoding = UTF8 पर सेट करते हैं, तो हर बार एक JVM शुरू होता है, यह आपकी जानकारी को उठाएगा।

स्रोत: http://whatiscomingtomyhead.wordpress.com/2012/01/02/get-rid-of-unmappable-character-for-encoding-cp1252-once-and-for-all/


वाह यह काम करता है मैं सिर्फ अपने .bashrc में इसे जोड़ता हूं, और इसने मेरी समस्या को ठीक कर दिया।
काउबोई-पेंग

महान काम किया, कमांड लाइन से मैंने निर्माण करने के लिए प्रवेश किया: javac MyJavaFile.java -encoding utf-8 -cp .;lib\*फिर इसे चलाते समय, मुझे उस अतिरिक्त एन्कोडिंग भाग को जोड़ने की आवश्यकता नहीं थी।
एज़र्सपॉट

23

इस लाइन को योर फ़ाइल में रखें। जावा मान के ऊपर .ग्रेड करें।

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

आप के लिए compileTestJavaऔर javadocसाथ ही एन्कोडिंग सेट करना चाह सकते हैं
फ्रैंक नेबलंग

8

अधिकांश समय यह संकलन त्रुटि तब आती है जब यूनिकोड (UTF-8 एन्कोडेड) फ़ाइल संकलित करता है

javac -encoding UTF-8 HelloWorld.java

और यह भी आप इस संकलन विकल्प को अपने IDE पूर्व में जोड़ सकते हैं: Intellij idea
(फ़ाइल> सेटिंग्स> जावा कंपाइलर) अतिरिक्त कमांड लाइन पैरामीटर के रूप में जोड़ें

यहां छवि विवरण दर्ज करें

-encoding: एन्कोडिंग स्रोत फ़ाइल एन्कोडिंग नाम सेट करें, जैसे कि EUC-JP और UTF-8 .. यदि -encoding निर्दिष्ट नहीं है, तो प्लेटफ़ॉर्म डिफ़ॉल्ट कनवर्टर का उपयोग किया जाता है। ( DOC )


8

ग्रेडिंग स्टेप्स

यदि आप ग्रेडल का उपयोग कर रहे हैं तो आप जावा प्लगइन को लागू करने वाली लाइन पा सकते हैं:

apply plugin: 'java'

फिर UTF-8 होने के लिए संकलन कार्य के लिए एन्कोडिंग सेट करें:

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

यदि आपके पास इकाई परीक्षण हैं, तो आप शायद उन लोगों को भी UTF-8 के साथ संकलित करना चाहते हैं:

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

कुल मिलाकर ग्रेड उदाहरण

इसका मतलब है कि समग्र ग्रेड कोड कुछ इस तरह दिखाई देगा:

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

2

यह मेरे लिए काम किया -

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

यदि आप ग्रहण का उपयोग करते हैं (ग्रहण आपके लिए utf8 कोड डाल सकते हैं यहां तक ​​कि आप utf8 वर्ण भी लिखते हैं। आप प्रोग्रामिंग करते समय सामान्य utf8 वर्ण देखेंगे, लेकिन पृष्ठभूमि utf8 कोड होगी);

  1. चुनते हैं प्रोजेक्ट का
  2. राइट क्लिक करें और चुनें गुण
  3. का चयन करें संसाधन पर संसाधन पैनल (दाएं मेनू के शीर्ष जो 2. के बाद खोला गया)
  4. आप संसाधन पैनल , टेक्स्ट फ़ाइल एन्कोडिंग में देख सकते हैं , अन्य का चयन करें जो आप चाहते हैं

पुनश्च: यदि आप कोड में स्थिर मूल्य रखते हैं तो यह ठीक होगा। उदाहरण के लिए स्ट्रिंग परीक्षण = "ıııııııçççççç";


1
"आप [प्रोग्रामिंग] कर रहे हैं, लेकिन [] [पृष्ठभूमि] utf8 कोड हो जाएगा" आप कोई मतलब नहीं है, जब आप सामान्य [एक] utf8 चरित्र देखेंगे। इसके अलावा, उपरोक्त प्रश्न के जवाब में मेरी लंबी टिप्पणी देखें।
tchrist

मैंने इसे ISO-8859-1 में बदल दिया, लेकिन फिर भी "UTF8 को एन्कोडिंग के लिए अयोग्य चरित्र" के बारे में एक संकलन त्रुटि मिली।
पचोरफ्लो

1

मुझे वही समस्या थी, जहां जावा त्रुटि संदेश में वर्ण सूचकांक रिपोर्ट की गई गलत थी। मैंने इसे कथित तौर पर हेक्स 0922 होने के स्थान पर दोहरे स्थान के वर्णों तक सीमित कर दिया था।


1

यदि कोई कमांड प्रॉम्प्ट से मावेन बिल्ड का उपयोग कर रहा है तो निम्न कमांड का उपयोग कर सकता है:

                    mvn -Dproject.build.sourceEncoding=UTF-8

1

यह सोच रहे लोगों के लिए कि यह कुछ प्रणालियों पर क्यों होता है और दूसरों पर नहीं (एक ही स्रोत के साथ, मापदंडों का निर्माण, और इसी तरह), अपने LANGपर्यावरण चर की जांच करें । मुझे चेतावनी / त्रुटि तब मिलती है LANG=C.UTF-8, जब नहीं LANG=en_US.UTF-8

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.