Java에서 "UTF-8"문자열 리터럴을 어디서 구할 수 있습니까?


490

이 코드에서 문자열 리터럴 대신 상수를 사용하려고합니다.

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

"UTF-8"코드에 다소 자주 나타나고 static final대신 일부 변수 를 참조하는 것이 좋습니다. JDK에서 이러한 변수를 어디에서 찾을 수 있는지 알고 있습니까?

BTW, 두 번째 생각으로, 그러한 상수는 나쁜 디자인입니다 : Public Static Literals ... 데이터 복제 솔루션이 아닙니다


11
이 질문을 참조하십시오 .
highlycaffeinated

1
참고 : 이미 Java 7을 사용중인 경우 Files.newBufferedWriter(Path path, Charset cs)NIO 에서 사용하십시오 .
Franklin Yu

답변:


836

Java 1.7 이상에서 java.nio.charset.StandardCharsetsCharset포함 할 상수를 정의합니다 UTF_8.

import java.nio.charset.StandardCharsets;

...

StandardCharsets.UTF_8.name();

안드로이드 : minSdk 19


3
그것에 .toString ()을 사용합니까?
Matt Broekhuis

54
.toString()작동하지만 올바른 기능은 .name()입니다. 99.9 % toString이 답이 아닙니다.
Roger

1
btw .displayName()는 의도 한대로 현지화를 위해 재정의되지 않는 한 작동합니다.
Roger

36
실제로 전화 할 필요는 없습니다 name(). Charset객체를 InputStreamReader생성자에 직접 전달할 수 있습니다 .
Natix

6
그리고 String아마도 레거시 이유로 인해를 필요로하는 다른 라이브러리가 있습니다 . 그러한 경우, 나는 Charset일반적으로에서 파생 된 객체를 유지하고 필요한 경우 StandardCharsets사용 name()합니다.
Magnilex

134

이제 commons-lang의org.apache.commons.lang3.CharEncoding.UTF_8 상수를 사용 합니다.


4
Lang 3.0을 사용하는 경우 : org.apache.commons.lang3.CharEncoding.UTF_8. (참고 "lang3").
Russell Silva

24
Java 1.7을 사용하는 경우 표준 라이브러리의 일부이므로 아래 @Roger의 답변을 참조하십시오.
Drew Stephens

2
PS "@ Roger 's answer below"는 이제 @ Roger 's answer above 위 입니다. ☝
게리 S.

Java 7이 java.nio.charset.StandardCharsets를 도입 한 이후
로이

66

구글 구아바 (자바에서 일을하는 경우 내가보기 엔, 어쨌든 권하고 싶습니다) 라이브러리는이 Charsets같은 정적 필드 클래스 Charsets.UTF_8, Charsets.UTF_16

Java 7부터는 java.nio.charset.StandardCharsets비슷한 상수에 대신 사용해야 합니다.

이 상수는 문자열이 아니며 실제 Charset인스턴스입니다. 문자 세트 이름을 사용하는 모든 표준 API에는 Charset대신 사용해야 하는 객체를 사용 하는 오버로드가 있습니다 .


3
그렇다면 Charsets.UTF_8.name ()이어야합니까?
AlikElzin-kilaka

1
@kilaka 그래, name ()이 최종이고 getDisplayName ()이 아니기 때문에 getDisplayName () 대신에 name ()을 사용하십시오
RKumsher

3
@ 버팔로 : 내 대답을 다시 읽으십시오 : java.nio.charset.StandardCharsets가능하면 타사 코드가 아닌 사용을 권장 합니다. 또한 Guava Charsets 정의는 "일관 적으로 수정되지"않으며 AFAIK는 이전 버전과의 호환성을 유지 한 적이 없으므로 비판이 필요하다고 생각하지 않습니다.
Daniel Pryden

2
@Buffalo : 그럴 수도 있지만 문제가 Charsets수업 과 관련이 있는지 의심 됩니다. 구아바에 대해 불평하고 싶다면 괜찮습니다. 그러나 이것은 불만의 장소가 아닙니다.
Daniel Pryden

1
하나의 문자열 상수를 얻으려면 멀티 메가 바이트 라이브러리를 포함하지 마십시오.
Jeffrey Blattman

50

이 페이지가 누군가의 웹 검색에 나타나는 경우 Java 1.7 부터 java.nio.charset.StandardCharsets 를 사용 하여 표준 문자 세트의 상수 정의에 액세스 할 수 있습니다.


나는 이것을 사용하려고 노력했지만 작동하지 않는 것 같습니다. 'Charset.defaultCharset ());' 'java.nio.charset. *'를 포함시킨 후 작동하는 것처럼 보이지만 'File.readAllLines'를 사용하려고 할 때 명시 적으로 UTF8을 참조 할 수 없습니다.
Roger

1
@Roger 무엇이 문제인 것 같습니까? 내가 볼 수있는 Files.readAllLines(Paths.get("path-to-some-file"), StandardCharsets.UTF_8);
것에서

문제가 무엇인지 모르지만 기억할 수없는 것을 변경 한 후에는 효과가있었습니다.
Roger

1
^^^ 아마도 IDE에서 대상 플랫폼을 변경해야 할 것입니다. IDE를 설치할 때 1.6이 최신 JDK 인 경우 IDE와 JDK 자체를 모두 제자리에서 업데이트 한 후에도 기본값으로 선택하여 기본값으로 유지했을 것입니다.
Bitbang3r

10

이 상수는 (같은 다른 사람의 사이에서 볼 수 UTF-16, US-ASCII학급 등) org.apache.commons.codec.CharEncoding뿐만 아니라.


9

최소한 표준 Java 라이브러리에는 없습니다. 문자 집합은 플랫폼마다 다르므로 Java에는 표준 목록이 없습니다.

그러나 이러한 상수를 포함하는 일부 타사 라이브러리가 있습니다. 다음 중 하나는 구아바 (Google 핵심 라이브러리)입니다. http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html


구아바의 문자셋 상수는 (문자열이 아닌) 문자셋입니다. InputStreamReader에는 문자열이 아닌 Charset을 취하는 또 다른 생성자가 있습니다. 실제로 문자열이 필요한 경우 예를 들어 Charsets.UTF_8.name ()입니다.
Ed Staub

1
문자 집합은 플랫폼마다 다를 수 있지만 UTF-8은 존재합니다.
tar

3
에 정의 된 모든 문자 집합 StandardCharsets은 모든 플랫폼의 모든 Java 구현에 존재해야합니다.
Krzysztof Krasoń

8

Charset.defaultCharset()API 또는 file.encoding속성을 사용할 수 있습니다 .

그러나 자신의 상수를 원한다면 직접 정의해야합니다.


11
기본 문자 세트는 일반적으로 OS 및 로케일 설정에 의해 결정되며 여러 Java 호출에서 동일하게 유지된다는 보장이 없습니다. 따라서 이것은 일정한 분리 "utf-8"을 대체하지 않습니다.
Jörn Horstmann

6

Java 1.7 이상

"UTF-8"문자열을 사용하지 말고 대신 Charsettype 매개 변수 를 사용하십시오 .

import java.nio.charset.StandardCharsets

...

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

4

당신이 사용하는 경우 OkHttp 자바 / 안드로이드 다음과 같은 상수를 사용할 수 있습니다 :

import com.squareup.okhttp.internal.Util;

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

2
OkHttp에서 제거되었으므로 다음 방법은 Charset.forName("UTF-8").name()API 19+보다 낮은 Android를 지원해야하는 경우 그렇지 않은 경우 사용할 수 있습니다.StandardCharsets.UTF_8.name()
mtrakal

3

표준에 대한 상수 정의. 이러한 문자 세트는 모든 Java 플랫폼 구현에서 사용 가능합니다. 1.7 이후

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

0

org.apache.commons.lang3.CharEncoding.UTF_8Java 7이 도입 된 후 클래스 가 더 이상 사용되지 않습니다.java.nio.charset.StandardCharsets

  • @JRE 문자 인코딩 이름 참조
  • @since 2.1
  • @deprecated Java 7에서는 이러한 상수를 다음과 같이 정의하는 {@link java.nio.charset.StandardCharsets}를 도입했습니다.
  • {@link Charset} 객체. 이 클래스에 제공된 문자열 값을 가져 오려면 {@link Charset # name ()}을 사용하십시오.
  • 이 수업은 향후 릴리스에서 제거 될 예정입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.