Де взяти рядковий літеральний рядок "UTF-8" на Java?


490

Я намагаюся використовувати константу замість рядкового літералу в цьому фрагменті коду:

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

"UTF-8"з'являється в коді досить часто, і було б набагато краще звернутися до якоїсь static finalзмінної. Чи знаєте ви, де я можу знайти таку змінну в JDK?

До речі, по-друге, такі константи є поганим дизайном: Публічні статичні літерали ... Чи не рішення для копіювання даних



1
Примітка: якщо ви вже користуєтесь Java 7, використовуйте Files.newBufferedWriter(Path path, Charset cs)NIO.
Франклін Ю

Відповіді:


836

У Java 1.7+ версія java.nio.charset.StandardCharsets визначає константи для Charsetвключення UTF_8.

import java.nio.charset.StandardCharsets;

...

StandardCharsets.UTF_8.name();

Для Android: minSdk 19


3
ви використовуєте .toString () для цього?
Метт Брукхуа

54
.toString()буде працювати, але належна функція є .name(). 99,9% toString - це не відповідь.
Роджер

1
btw .displayName()також буде працювати, якщо це не буде замінено для локалізації за призначенням.
Роджер

36
Вам зовсім не потрібно дзвонити name(). Ви можете безпосередньо передати Charsetоб’єкт в InputStreamReaderконструктор.
Natix

6
А ще є інші мочки, які вимагають String, можливо, наслідок. У таких випадках я тримаю Charsetоб'єкт навколо, як правило, отриманий від нього StandardCharsets, і використовую name()за потреби.
Магнілекс

134

Тепер я використовую org.apache.commons.lang3.CharEncoding.UTF_8константу від commons-lang .


4
Для тих , хто використовує Lang 3.0: org.apache.commons.lang3.CharEncoding.UTF_8. (Примітка "lang3").
Рассел Сілва

24
Якщо ви використовуєте Java 1.7, дивіться відповідь @ Roger нижче, оскільки це частина стандартної бібліотеки.
Дрю Стівенс

2
PS "@ Відповідь Роджера нижче" зараз відповідь @ Роджера вище . ☝
Гарі С.

Цей клас застарілий, оскільки Java 7 представляє java.nio.charset.StandardCharsets
sendon1982

66

Google гуава бібліотека (який я настійно рекомендую в будь-якому випадку, якщо ви робите роботу в Java) має 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 (), оскільки name () є остаточним, а getDisplayName () - ні,
RKumsher

3
@Buffalo: Будь ласка, прочитайте мою відповідь ще раз: рекомендує використовувати, java.nio.charset.StandardCharsetsколи можливо, це не третій код. Окрім того, визначення Charsets Guava не "постійно змінюються", а AFAIK ніколи не порушував зворотньої сумісності, тому я не думаю, що ваша критика є виправданою.
Даніель Приден

2
@Buffalo: Це, як може бути, але я сумніваюся, що ваші питання мали щось спільне з Charsetsкласом. Якщо ви хочете поскаржитися на Гуаву, це добре, але для цих скарг це не місце.
Даніель Приден

1
Будь ласка, не включайте багатомігабайтну бібліотеку для отримання однієї рядкової постійної.
Джефрі Блатман

50

У випадку, якщо ця сторінка з’явиться у веб-пошуку когось, на Java 1.7 тепер ви можете використовувати java.nio.charset.StandardCharsets, щоб отримати доступ до постійних визначень стандартних діаграм.


Я намагався це використати, але, здається, це не працює. 'Charset.defaultCharset ());' здається, працює після включення "java.nio.charset. *", але я не можу явно посилатися на UTF8, коли я намагаюся використовувати "File.readAllLines".
Роджер

1
@Roger У чому здається проблема? З того, що я бачу, ви можете просто зателефонувати:Files.readAllLines(Paths.get("path-to-some-file"), StandardCharsets.UTF_8);
cosjav

Я не знаю, в чому проблема, але це спрацювало на мене після зміни чогось, чого я не можу згадати.
Роджер

1
^^^ Напевно, вам довелося змінити цільову платформу в IDE. Якщо 1.6 був вашим останнім JDK під час встановлення IDE, він, ймовірно, вибрав його за замовчуванням і зберігав його за замовчуванням довго після того, як ви оновили і IDE, і JDK на місці.
Bitbang3r


9

Їх немає (принаймні, у стандартній бібліотеці Java). Набори символів різняться від платформи до платформи, тому в Java немає стандартного переліку їх.

Є деякі сторонні бібліотеки, які містять ці константи. Однією з них є Guava (основні бібліотеки Google): http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html


Мені знадобилося секунду, щоб зайнятися цим ... Константи Шарсети Гуави - це (не дивно), а не струни. InputStreamReader має інший конструктор, який приймає Charset, а не рядок. Якщо вам дійсно потрібна струна, це, наприклад, Charsets.UTF_8.name ().
Ед Штауб

1
Набір символів може відрізнятися від платформи до платформи, але UTF-8 гарантовано існує.
тар

3
Усі діаграми, визначені в StandardCharsets, гарантовано існують у кожній реалізації Java на кожній платформі.
Кшиштоф Красонь

8

Ви можете використовувати Charset.defaultCharset()API або file.encodingвластивість.

Але якщо ви хочете власної постійної, вам потрібно буде визначити це самостійно.


11
Графік за замовчуванням зазвичай визначається налаштуваннями ОС та локальної служби, я не думаю, що існує гарантія, що вона залишається однаковою для декількох викликів Java. Тож це не є заміною для постійного відокремлюваного "utf-8".
Йорн Хорстманн

6

На Java 1.7+

Не використовуйте рядок "UTF-8", замість цього використовуйте Charsetпараметр типу:

import java.nio.charset.StandardCharsets

...

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

4

Якщо ви використовуєте OkHttp для Java / Android, ви можете використовувати таку константу:

import com.squareup.okhttp.internal.Util;

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

2
його видалено з OkHttp, тож наступний спосіб: Charset.forName("UTF-8").name()коли вам потрібна підтримка для нижчого Android, ніж API 19+, інакше ви можете використовувати: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_8застарілий після введення Java 7java.nio.charset.StandardCharsets

  • @see імена кодування символів JRE
  • @since 2.1
  • @deprecated Java 7 представив {@link java.nio.charset.StandardCharsets}, який визначає ці константи як
  • {@link Charset} об'єктів. Використовуйте {@link Charset # name ()}, щоб отримати рядкові значення, надані в цьому класі.
  • Цей клас буде видалено в майбутньому випуску.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.