जावा में "UTF-8" स्ट्रिंग शाब्दिक कहाँ से प्राप्त करें?


489

मैं कोड के इस टुकड़े में एक स्ट्रिंग शाब्दिक के बजाय एक निरंतर उपयोग करने की कोशिश कर रहा हूं:

new InputStreamReader(new FileInputStream(file), "UTF-8")

"UTF-8"अक्सर कोड में दिखाई देता है, और static finalइसके बजाय कुछ चर का संदर्भ देना बेहतर होगा । क्या आप जानते हैं कि मुझे JDK में ऐसा वैरिएबल कहां मिल सकता है?

BTW, एक दूसरे विचार पर, ऐसे स्थिरांक खराब डिजाइन हैं: सार्वजनिक स्थैतिक साहित्य ... डेटा डुप्लीकेशन के लिए समाधान नहीं हैं



1
नोट: यदि आप पहले से ही जावा 7 पर हैं, तो Files.newBufferedWriter(Path path, Charset cs)NIO से उपयोग करें ।
फ्रैंकलिन यू

जवाबों:


835

जावा 1.7+ में java.nio.charset.StandardCharsetsCharset शामिल करने के लिए स्थिरांक को परिभाषित करता है UTF_8

import java.nio.charset.StandardCharsets;

...

StandardCharsets.UTF_8.name();

Android के लिए: minSdk 19


3
क्या आप .toString () का उपयोग करते हैं?
मैट ब्रोकरुहिस

54
.toString()कार्य करेगी, लेकिन उचित समारोह है .name()। 99.9% स्टर्लिंग का उत्तर नहीं है।
रोजर

1
btw .displayName()भी तब तक काम करेगा जब तक कि यह स्थानीयकरण के उद्देश्य से ओवरराइड नहीं होता।
रोजर

36
आपको वास्तव में कॉल करने की आवश्यकता नहीं है name()। आप सीधे कंस्ट्रक्टर Charsetमें ऑब्जेक्ट को पास कर सकते हैं InputStreamReader
नैटिक्स

6
और कुछ अन्य Stringकारण भी हैं, जिनकी आवश्यकता शायद विरासत की वजहों से है। ऐसे मामलों में, मैं Charsetआसपास एक वस्तु रखता हूं , जो आम तौर पर प्राप्त होता है StandardCharsets, और name()यदि आवश्यक हो तो उपयोग करें ।
मैगनीलेक्स

134

अब मैं कॉमन्स-लैंगorg.apache.commons.lang3.CharEncoding.UTF_8 से निरंतर उपयोग करता हूं ।


4
लैंग 3.0 का उपयोग करने वालों के लिए org.apache.commons.lang3.CharEncoding.UTF_8:। (नोट "lang3")।
रसेल सिल्वा

24
यदि आप जावा 1.7 का उपयोग कर रहे हैं, तो नीचे @ रोजर का उत्तर देखें क्योंकि यह मानक पुस्तकालय का हिस्सा है।
ड्रू स्टीफंस

2
PS "@ रोजर का जवाब नीचे" अब ऊपर रोजर का जवाब है । ☝
गैरी एस

जावा 7 परिचय java.nio.charset.StandardCharsets के बाद से उस वर्ग को हटा दिया गया है
sendon1982

66

गूगल अमरूद पुस्तकालय (जो मैं अत्यधिक वैसे भी सलाह देते हैं, अगर आप जावा में काम कर रहे हैं) एक है Charsetsकी तरह स्थिर क्षेत्रों के साथ वर्ग Charsets.UTF_8, Charsets.UTF_16आदि

जावा 7 के बाद से आपको केवल java.nio.charset.StandardCharsetsतुलनीय स्थिरांक के बजाय उपयोग करना चाहिए ।

ध्यान दें कि ये स्थिरांक तार नहीं हैं, वे वास्तविक Charsetउदाहरण हैं। सभी मानक एपीआई जो एक चारसेट नाम लेते हैं, उनमें एक अधिभार होता है Charsetजो एक वस्तु लेता है जिसे आपको इसके बजाय उपयोग करना चाहिए।


3
तो, Charsets.UTF_8.name () होना चाहिए?
एलिकएल्ज़िन-किलाका

1
@kilaka हाँ का उपयोग करें () नाम के बजाय getDisplayName () के बाद से नाम () अंतिम है और getDisplayName () नहीं है
RKumsher

3
@ बफ़ेलो: कृपया मेरे उत्तर को फिर से पढ़ें: यह java.nio.charset.StandardCharsetsसंभव होने पर उपयोग करने की सिफारिश करता है, जो तीसरे पक्ष का कोड नहीं है। इसके अतिरिक्त, अमरूद चार्ट्स की परिभाषाएं "लगातार संशोधित" नहीं हैं और AFAIK ने कभी भी पीछे की संगतता को नहीं तोड़ा है, इसलिए मुझे नहीं लगता कि आपकी आलोचना को वारंट किया गया है।
डैनियल प्रीडेन

2
@ बफैलो: ऐसा ही हो सकता है, लेकिन मुझे संदेह है कि आपके मुद्दों का Charsetsकक्षा से कोई लेना-देना नहीं था । यदि आप अमरूद के बारे में शिकायत करना चाहते हैं, तो यह ठीक है, लेकिन यह उन शिकायतों के लिए जगह नहीं है।
डैनियल प्रेडेन

1
एक स्ट्रिंग स्थिरांक प्राप्त करने के लिए कृपया बहु-मेगाबाइट लाइब्रेरी शामिल न करें।
जेफरी बट्टमैन

50

यदि यह पृष्ठ किसी वेब खोज में आता है, तो जावा 1.7 के रूप में आप मानक वर्णों की निरंतर परिभाषा तक पहुँच प्राप्त करने के लिए java.nio.charset.StandardCharsets का उपयोग कर सकते हैं ।


मैं इसका उपयोग करने की कोशिश कर रहा हूं लेकिन यह काम नहीं करता है। 'Charset.defaultCharset ());' 'java.nio.charset। *' को शामिल करने के बाद काम करने लगता है, लेकिन जब मैं 'File.readAllLines' का उपयोग करने की कोशिश कर रहा हूं, तो मैं स्पष्ट रूप से UTF8 का संदर्भ नहीं ले सकता।
रोजर

1
@Roger समस्या क्या लगती है? मैं जो देख सकता हूं उससे आप कॉल कर सकते हैं:Files.readAllLines(Paths.get("path-to-some-file"), StandardCharsets.UTF_8);
cosjav

मुझे नहीं पता कि समस्या क्या थी, लेकिन इसने मेरे लिए कुछ बदलने के बाद काम किया जो मुझे याद नहीं है।
रोजर

1
^ ^ ^ आपको शायद आईडीई में लक्ष्य प्लेटफ़ॉर्म को बदलना होगा। यदि आप IDE स्थापित करते समय 1.6 आपका नवीनतम JDK था, तो संभवतः उसने इसे डिफ़ॉल्ट के रूप में चुना था और जब तक आप IDE और JDK दोनों को अपने स्थान पर अपडेट नहीं कर लेते, तब तक इसे डिफ़ॉल्ट के रूप में रखा जाता था।
बिटबंग 3 आर 20'13

10

: यह लगातार (के रूप में अन्य लोगों के अलावा उपलब्ध है UTF-16, US-ASCIIकक्षा में, आदि) org.apache.commons.codec.CharEncodingके रूप में अच्छी तरह से।


9

कोई भी नहीं हैं (कम से कम मानक जावा पुस्तकालय में)। चरित्र सेट प्लेटफ़ॉर्म से प्लेटफ़ॉर्म पर भिन्न होते हैं, इसलिए जावा में उनकी कोई मानक सूची नहीं है।

कुछ 3 पार्टी पुस्तकालय हैं जिनमें ये स्थिरांक शामिल हैं। इनमें से एक अमरूद (Google कोर लाइब्रेरी): http://guava-lbooks.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html


मुझे इस पर पकड़ने में एक सेकंड का समय लगा ... अमरूद के चारसेट्स कॉन्स्टेंट हैं (कोई आश्चर्य की बात नहीं) चार्ट्स, स्ट्रिंग्स नहीं। InputStreamReader में एक और कंस्ट्रक्टर है जो एक स्ट्रिंग के बजाय एक चारसेट लेता है। यदि आपको वास्तव में स्ट्रिंग की आवश्यकता है, तो यह उदाहरण है Charsets.UTF_8.name ()।
एड स्टब

1
कैरेक्टर सेट्स प्लेटफॉर्म से प्लेटफॉर्म में भिन्न हो सकते हैं, लेकिन UTF-8 के अस्तित्व की गारंटी है।
टार

3
परिभाषित किए गए सभी चार्ट StandardCharsetsप्रत्येक प्लेटफॉर्म पर जावा कार्यान्वयन में मौजूद होने की गारंटी देते हैं।
Krzysztof Krasoń

8

आप Charset.defaultCharset()एपीआई या file.encodingसंपत्ति का उपयोग कर सकते हैं।

लेकिन यदि आप अपना स्वयं का स्थिरांक चाहते हैं, तो आपको इसे स्वयं परिभाषित करने की आवश्यकता होगी।


11
डिफ़ॉल्ट चारसेट आमतौर पर ओएस और लोकेल सेटिंग्स द्वारा निर्धारित किया जाता है, मुझे नहीं लगता कि कोई गारंटी है कि यह कई जावा चालान के लिए समान है। तो यह एक निरंतर sepcifying "utf-8" के लिए कोई प्रतिस्थापन नहीं है।
जोर्न होर्स्टमन

6

जावा में 1.7+

"UTF-8" स्ट्रिंग का उपयोग न करें, इसके बजाय Charsetटाइप पैरामीटर का उपयोग करें:

import java.nio.charset.StandardCharsets

...

new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);

4

यदि आप Java / Android के लिए OkHttp का उपयोग कर रहे हैं, तो आप निम्न स्थिरांक का उपयोग कर सकते हैं:

import com.squareup.okhttp.internal.Util;

Util.UTF_8; // Charset
Util.UTF_8.name(); // String

2
यह OkHttp से हटा दिया गया है, इसलिए अगला तरीका यह है: Charset.forName("UTF-8").name()जब आपको एपीआई 19+ से कम Android के लिए समर्थन की आवश्यकता होती है अन्यथा आप उपयोग कर सकते हैं:StandardCharsets.UTF_8.name()
mtrakal

3

मानक के लिए लगातार परिभाषाएँ। ये चार्ट जावा प्लेटफॉर्म के हर कार्यान्वयन पर उपलब्ध होने की गारंटी है। 1.7 के बाद से

 package java.nio.charset;
 Charset utf8 = StandardCharsets.UTF_8;

0

org.apache.commons.lang3.CharEncoding.UTF_8जावा 7 पेश किए जाने के बाद कक्षा को हटा दिया गया हैjava.nio.charset.StandardCharsets

  • @ हम JRE वर्ण एन्कोडिंग नाम
  • @ शिन २.१
  • @deprecated Java 7 ने {@link java.nio.charset.StandardCharsets} पेश किया, जो इन स्थिरांक को परिभाषित करता है
  • {@link चारसेट} ऑब्जेक्ट। इस श्रेणी में दिए गए स्ट्रिंग मान प्राप्त करने के लिए {@link चारसेट # नाम ()} का उपयोग करें।
  • भविष्य की रिलीज़ में इस वर्ग को हटा दिया जाएगा।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.