- Закодируйте строку в UTF-8 на Java
- Вступление
- Использование метода getBytes()
- Кодируйте строку в UTF-8 с помощью стандартных наборов символов Java 7
- Git Essentials
- Закодируйте строку в UTF-8 с помощью Apache Commons
- Вывод
- Кодировка Utf-8 для Android
- Android, UTF8 – Как обеспечить, чтобы UTF8 использовался для общих предпочтений
- Как читать и писать UTF-8 на диск на Android?
Закодируйте строку в 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 , мы можем продолжить и безопасно создать новую строку из этого:
Примечание: Вместо того, чтобы кодировать их с помощью метода 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 и выбрав свойства. Если это неправильная кодировка, вам нужно будет повторно ввести специальные символы после ее изменения, или, по крайней мере, это был мой опыт.
Источник