Android utf 8 класс

Закодируйте строку в UTF-8 на Java

В этом уроке мы рассмотрим, как кодировать строку в UTF-8 на Java – с помощью стандартных наборов символов, getBytes() с помощью ByteBuffer и Apache Commons с примерами.

Автор: Branko Ilic
Дата записи

Вступление

При работе со строками | в Java нам часто приходится кодировать их в определенную кодировку, такую как UTF-8 .

UTF-8 представляет собой кодировку символов переменной ширины, которая использует от одного до четырех восьмибитных байтов для представления всех допустимых кодовых точек Юникода .

Кодовая точка может представлять отдельные символы, но также иметь другие значения, например, для форматирования. “Переменная ширина” означает, что он кодирует каждую кодовую точку с разным количеством байтов (от одного до четырех), и в качестве меры экономии места обычно используемые кодовые точки представлены меньшим количеством байтов, чем те, которые используются реже.

UTF-8 использует один байт для представления кодовых точек из 0-127 , сделав первый 128 код указывает взаимно однозначную карту с символами ASCII, поэтому UTF-8 обратно совместим с ASCII.

Примечание: Java кодирует все строки в UTF-16, который использует минимум два байта для хранения кодовых точек. Зачем тогда нам нужно было бы конвертировать в UTF-8?

Не все входные данные могут быть UTF-16, или UTF-8, если на то пошло. На самом деле вы можете получить строку в кодировке ASCII, которая поддерживает не так много символов, как UTF-8. Кроме того, не все выходные данные могут обрабатывать UTF-16, поэтому имеет смысл преобразовать в более универсальный UTF-8.

Мы будем работать с несколькими Строками , которые содержат символы Юникода , с которыми вы, возможно, не сталкиваетесь ежедневно, такие как č , β и あ , имитирующие ввод данных пользователем.

Давайте выпишем пару строк:

Теперь давайте воспользуемся Строкой(байт[] байт, кодировка кодировки) конструктором строки, чтобы воссоздать эти строки, но с другой кодировкой , имитирующей ввод ASCII , который поступил к нам в первую очередь:

Как только мы создадим эти строки и закодируем их в виде символов ASCII, мы сможем их распечатать:

В то время как первые две строки содержат всего несколько символов, которые не являются допустимыми символами ASCII, последняя строка не содержит никаких .

Чтобы избежать этой проблемы, мы можем предположить, что не все входные данные уже могут быть закодированы по нашему вкусу – и закодировать их, чтобы самим решить такие случаи. Существует несколько способов кодирования строки в UTF-8 на Java.

Кодирование строки в Java просто означает ввод определенных байтов в массив байтов, который представляет собой строку, предоставляя дополнительную информацию, которую можно использовать для ее форматирования, как только мы сформируем экземпляр String .

Использование метода getBytes()

Класс String , состоящий из байтов, естественно, предлагает метод getBytes () , который возвращает массив байтов, используемый для создания строки. Поскольку кодирование на самом деле просто манипулирует этим массивом байтов, мы можем поместить этот массив через | кодировку , чтобы сформировать его при получении данных.

По умолчанию, без указания кодировки , байты кодируются с использованием платформы по умолчанию Кодировки – которая может не быть UTF-8 или UTF-16. Давайте возьмем байты строки и распечатаем их:

Это кодовые точки для наших закодированных символов, и они не очень полезны для человеческих глаз. Хотя, опять же, мы можем использовать конструктор String для создания удобочитаемой строки из этой самой последовательности. Учитывая тот факт , что мы закодировали этот массив байтов в UTF_8 , мы можем продолжить и безопасно создать новую строку из этого:

Читайте также:  Start building android apps

Примечание: Вместо того, чтобы кодировать их с помощью метода getBytes () , вы можете также кодировать байты с помощью конструктора строк:

Теперь выводится та же самая строка, с которой мы начали, но закодированная в UTF-8:

Кодируйте строку в UTF-8 с помощью стандартных наборов символов Java 7

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Начиная с Java 7 , мы познакомились с классом Стандартные наборы символов , в котором доступно несколько наборов символов , таких как US_ASCII , ISO_8859_1 , UTF_8 и UTF-16 среди прочих.

Каждая Кодировка имеет кодирование() и декодирование() метод, который принимает Буфер символов (который реализует последовательность символов , такую же, как Строка ). С практической точки зрения – это означает, что мы можем вставить строку в encode() методы кодировки .

Метод encode() возвращает ByteBuffer , который мы можем легко снова превратить в строку.

Ранее, когда мы использовали наш метод getBytes () , мы сохраняли полученные байты в массиве байтов, но при использовании класса StandardCharsets все немного по-другому. Сначала нам нужно использовать класс ByteBuffer для хранения наших байтов. Затем нам нужно как кодировать , так и декодировать обратно наши недавно выделенные байты. Давайте посмотрим, как это работает в коде:

Выполнение этого кода приводит к:

Закодируйте строку в UTF-8 с помощью Apache Commons

Пакет кодеков Apache Commons содержит простые кодеры и декодеры для различных форматов, таких как Base64 и Шестнадцатеричный . В дополнение к этим широко используемым кодерам и декодерам, пакет кодеков также поддерживает набор утилит фонетического кодирования .

Чтобы мы могли использовать кодек Apache Commons, нам нужно добавить его в наш проект в качестве внешней зависимости.

Используя Maven, давайте добавим зависимость commons-кодек в ваш pom.xml файл:

В качестве альтернативы, если вы используете Gradle:

Теперь мы можем использовать служебные классы Apache Commons – и, как обычно, мы будем использовать класс StringUtils .

Это позволяет нам преобразовывать строки в байты и из байтов, используя различные кодировки, требуемые спецификацией Java. Этот класс является нулевым и потокобезопасным, поэтому у нас есть дополнительный уровень защиты при работе со строками.

Для кодирования строки в UTF-8 с помощью класса StringUtils Apache Common мы можем использовать метод getBytes Utf 8 () , который работает так же, как метод getBytes() с указанной кодировкой :

Или , вы можете использовать обычный StringUtils класс из commons-lang3 зависимости:

Если вы используете Gradle:

И теперь мы можем использовать почти тот же подход, что и с обычными строками:

Благодаря этому подход является потокобезопасным и нулевым:

Вывод

В этом уроке мы рассмотрели как кодировать строку Java в UTF-8 . Мы рассмотрели несколько подходов – ручное создание строки с использованием getBytes() и управление ими, класс Java 7 Стандартные наборы символов , а также Apache Commons.

Источник

Кодировка Utf-8 для Android

У меня проблема с кодировкой utf-8.

Я извлекаю из данных базы данных MySQL, отформатированных в UTF-8 (с большим количеством китайских символов) с Java, и я помещаю их в некоторые файлы txt: (это пример .. у меня много данных)

С этими txt-файлами я создам некоторый TextView, который я использую, чтобы заполнить некоторые действия в моем приложении для Android, но не все символы правильно отображаются: большинство из них верны, но некоторые из них не распознаются, а они показаны как черные Бриллиант с белым вопросительным знаком внутри.

Я также пробовал с этим: но я получил худшие результаты

Кто-нибудь есть идеи? благодаря!

Изменить i подключиться к моей БД с помощью:

Читайте также:  Убрать нижнюю строку андроид

И когда я выполняю в БД запрос:

Я получаю результат

Поэтому я думаю, что DB кодируется в UTF-8, и мое соединение с ним может обрабатывать UTF-8

Вам нужно выяснить, в какой фазе это происходит: 1- Где вы загружаете текст из базы данных и 2-, где вы записываете их в файл.

Следует отметить, что ваша база данных должна быть создана с кодировкой UTF-8, и ваше соединение также должно ее поддерживать. Примером URL-адреса соединения JDBC, который поддерживает UTF-8, может быть:

Симптом, который вы наблюдаете после указания кодировки в getBytes («UTF-8»), является четким указанием на то, что то, что вы получаете из базы данных, не находится в UTF-8.

Также попробуйте преобразовать из кодировки, которую вы подозреваете в данных (например, ISO-8859-1):

@ Houman001 прав. Вы должны будете заботиться в течение этой двух процедур.

У меня есть одна и та же проблема с арабским текстом до нескольких дней. Но теперь я решил это. Я решил это, сделав его для записи в базу данных с кодировкой UTF-8. А также использовать некоторый арабский шрифт, предоставленный моим разработчиком шрифтов. Который приводит меня к тексту на арабском языке, как я хочу.

Поэтому, будьте внимательны во время разбора и передачи данных от одного к другому и убедитесь, что он находится в формате кодирования UTF-8.

Надеюсь, эта вещь поможет вам.

Для подключения к базе данных я использовал это для всех UTF-8, и он работает хорошо

Это класс, который вы можете использовать, просто отредактируйте информацию о своем имени пользователя, пароле и имени базы данных

Когда вы хотите отправить данные с сервера на Android, попробуйте это

На андроиде (или любом получателе данных) попробуйте это

Источник

Android, UTF8 – Как обеспечить, чтобы UTF8 использовался для общих предпочтений

Как обеспечить, чтобы UTF8 использовался для общего меню предпочтений? У меня есть меню настроек Android, которое позволяет пользователю указать свое имя, среди прочего.

Мне нужно знать, как преобразовать данные, хранящиеся в общих предпочтениях, в формат UTF8

Меню предпочтений выложено в xml с использованием кодировки utf8 в файле с параметрами в папке res / xml и выглядит так:

Класс, который обрабатывает это,

Я предположил, что установка Гарантирует, что текст будет закодирован в формате UTF8, но это не всегда так. Я получаю значения во всех форматах. Некоторые примеры

«: – $ B-) O: -): – P = -ob -): – D: -Q: -X: -: – |! \ П: ‘(: – * XDo_O: -X: -C: -X: O: -X = -O; -): -): -); -): – D: OX- (o_O: -V: – @: – V: -X: -Do_O :: – C \ XBF \ xÀ1 \ xÀ1 \ XAB \ Xbb \ XAE \ xA9 ^ \ xA5 \ xA5? [\ xÀ2>? \ xÀ2 \ xÀ2 \ xA5 \ XA3? $ \ XBF \ xÀ1 \ XAE \ xA7> \xB0]\xA3?\xA7\xA1\\\xAB\xBB\xAE^«]]||||><_| ] ||| \ xB0 \ xB0? "

Да, это один набор рубинов в последнем примере.

Проблемы, которые я запускаю при попытке отправить nmes в качестве запроса json HTTP POST или PUT на мой веб-сервер, используя следующий код

Это вызывает всевозможные проблемы на моем веб-сервере, которые ожидают действительный JSON (то есть UTF8), поскольку JSON следует отправлять в кодировке UTF8 в первую очередь.

1) Почему Действительно устанавливает кодировку UTF8? При использовании в макете?

2) Как лучше всего гарантировать, что я всегда получаю действительные символы формата UTF8, отправленные на мой веб-сервер? Должно ли это обрабатываться запросом put или кодом, который сохраняет общее предпочтение или или кодом, который заполняет json-объект или, возможно, комбинацию из вышеперечисленного? или что-то другое?

Это следует из этого вопроса RoR. Rails 3 – Как обрабатывать ошибку PG неполный многобайтовый символ

Ключ должен понять разницу между UTF-8 и Unicode .

  • Java обрабатывает символы и строки в памяти с помощью Unicode. Каждый символ хранится в двух байтах.
  • Когда текст передается между процессами (например, на веб-сервер) или записывается в / считывание с диска, внутреннее представление преобразуется в формат, отличный от проводного. Это кодирование или декодирование. UTF-8 является самым популярным, но в других форматах:
    • UTF-16
    • ISO 8859-1
Читайте также:  Как добавить часовой пояс андроид

В вашем вопросе вы упомянули, что XML-файлы закодированы в utf-8: это хорошо, и вы сможете помещать в файлы иностранных символов, но это указывает кодировку только для этого конкретного XML-файла .

Эти XML-файлы будут скомпилированы в ресурсы Android и будут содержать правильные значения (вы можете проверить это, если хотите, в отладчике или сохранить промежуточные файлы ресурсов Java из цепочки сборки).

Проблема почти наверняка заключается в том, что вы отправляете данные и получаете данные с HTTP-сервера, в частности, где эти данные преобразуются между байтами в сети и Java String . В настоящее время вы не устанавливаете его в запросе – это можно сделать, как описано в документации для Apache HTTPClient .

Хотя сервер может уже потребовать / предположить это, это, безусловно, хорошо, чтобы четко указывать в запросе.

Вам также необходимо убедиться, что сервер (тот, что в Rails 3 – как обрабатывать ошибку PG Error неполный многобайтовый символ ):

  • Ожидает UTF-8
  • Декодирует запрос с использованием декодера UTF-8
  • Кодирует ответ с использованием кодировки UTF-8

(Извините, но я не знаю Ruby on Rails, поэтому я не знаю, как конкретно помочь там).

Вернувшись в конец Android, вам также необходимо убедиться, что ваша библиотека HTTP декодирует ответ с помощью декодера UTF-8. Если вы справитесь с этим сами, убедитесь, что этот конструктор String вы используете, а аргумент – «utf-8»:

  • Public String (byte [] data, String charsetName)

После того, как клиент и сервер используют UTF-8, ваши проблемы будут решены.

Чтобы помочь отладке здесь, я предлагаю:

    Несколько операторов ведения журнала на сервере и клиенте, которые печатают соответствующие строки как можно ближе к HTTP-коду

Запуск с клиентом, настроенным для разговора через прокси-сервер отладки. Изучите запрос и ответ и убедитесь, что они действительно UTF-8. Прокси включают:

Источник

Как читать и писать UTF-8 на диск на Android?

Я не могу читать и писать расширенные символы (например, французские акцентированные символы) в текстовый файл, используя стандартные методы InputStreamReader, показанные в примерах API Android. Когда я читаю файл, используя:

Чтение строки усекается расширенными символами, а не в конце строки. Вторая половина строки появляется на следующей строке. Я предполагаю, что мне нужно сохранить мои данные как UTF-8, но я не могу найти примеров этого, и я новичок в Java.

Может ли кто-нибудь предоставить мне пример или ссылку на соответствующую документацию?

Очень простой и понятный. 🙂

Когда вы создаете экземпляр InputStreamReader , используйте конструктор, который принимает набор символов.

И сделать аналогичную вещь с OutputStreamWriter

В каком-то классе утилиты в моем коде, чтобы я мог позвонить (см. Больше в Doc )

И не нужно обрабатывать UnsupportedEncodingException каждый раз.

Это должно просто работать на Android, даже без явного указания UTF-8, потому что кодировка по умолчанию UTF-8. Если вы можете воспроизвести эту проблему, пожалуйста, поднимите ошибку с воспроизводимым тестовым примером здесь:

Если вы столкнулись с такой проблемой, попробуйте это сделать. Вы должны Decode и Decode свои данные в Base64 . Это сработало для меня. Я могу поделиться кодом, если вам это нужно.

Проверьте кодировку файла, щелкнув его правой кнопкой мыши в Project Explorer и выбрав свойства. Если это неправильная кодировка, вам нужно будет повторно ввести специальные символы после ее изменения, или, по крайней мере, это был мой опыт.

Источник

Оцените статью