Java 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. Давайте возьмем байты строки и распечатаем их:

Читайте также:  Riot civil unrest андроид

Это кодовые точки для наших закодированных символов, и они не очень полезны для человеческих глаз. Хотя, опять же, мы можем использовать конструктор 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.

Источник

file was loaded in the wrong encoding: ‘UTF-8’ in android studio

my android studio gone crazy like this please help??

Читайте также:  Mobile agent android build

file was loaded in the wrong encoding: ‘UTF-8’ in android studio

13 Answers 13

An encoding issue can be solved by deleting all files contained in the Android Studio «caches» folder, which can be found in «C:\Users .AndroidStudioX.Y\system\caches».

Make sure that to close Android Studio before deleting.

For people in future:

I had the same problem.

I was able to solve it simply by making a copy of the project and opened the copied project. Copied project worked perfectly fine.

Note: I got this problem because of improper shutdown of my PC.

In my case it happend after Windows died with the blue screen, here’s how I fixed it:

  1. Close Android Studio
  2. Find a directory named .AndroidStudioX.X in C:Users/YourUsername and rename it to old.AndroidStudioX.X
  3. Restart Android Studio and choose the renamed old.AndroidStudioX.X to import settings from.

you have to just delete the catches folder in C:/users/»your PC name»/AndroidStudio(version code). Sometimes it gets disturbed because of some reasons like you have shut down the PC in improper way so it won’t get enough time to shutDown all stuff So all that errors occurs.

I think it would definitely work for you. Have a nice day. 🙂

All you need is to remove the Android Studio settings directory, which can be found:

Close Android Studio, delete the directory, then reopen Android-Studio and open your project.

Also if it happens on a different IDE, it is the same approach.

If the issue persists, try to copy the content of your project directory into a new directory, then open the project from the new directory.

On Windows close Android Studio and delete its cache directory:

This is an old one but I just click Invalidate Cache / Restart on file option in IDE and after restart, it works.

Version Android Studio v4.1

This is an old issue, but if anyone comes across this, what isn’t mentioned above, but happening for me is that the original file on disk is intact java code. Android Studio is reading it like this for some reason.

I had the same problem and how I fixed it is that I just went to the directory where the java files for my project are located, which in my case is users/user name/AndroidStudioProjects/Project name/app/src/main/java/com/example/android/project name , and here you will find all java codes you wrote for your project just open the one making the problem with notepad and you will find your code here in the right format and perfect just copy all of it and get back to Android Studio window and delete the wrong formatted code and paste this one and wait for it to sync and that’s it. If you face the same issue with XML codes just do the same thing find the directory where XML files are located.

This worked for me, I clicked on utf-8 and code is displayed in proper format.

Источник

Send utf-8 encoded strings in Android HTTP request

I have made a HTTP-post inside my android application. Values are sent as strings from my app to my webserver. Problem is, the values are not in UTF-8 as I want them to be. My webserver has UTF-8 encoding so I know that there is code inside my app that I need to change. See my snippet below:

Читайте также:  Lan плагин total commander для android как пользоваться

For an example, the letter ‘ö’ becomes a ‘?’. How do I fix this? Cheers!

2 Answers 2

The biggest single reason that characters get converted into question marks is the conversion of characters to bytes, and then back into characters, not matching.

The code you have supplied has this line:

This is problematic because you are not specifying how to convert the bytes into characters. Instead you probably want this:

What you specify for the character encoding will depend upon the character encoding that you have specified elsewhere. Without specifying the character encoding, you will get the «default» character encoding, and that depends upon settings in both the client and the server. Java uses Unicode, and UTF-8 is the only encoding that will preserve all the characters that Java allows.

For debugging, you may want to use the InputStream and retrieve bytes from that, and print out the byte values, in order to verify that they are indeed UTF-8 encoded representations of the original character values. The proper encoding of ‘ö’ (x00F6) is ‘ö’ (x00C3 x00B6).

You will also need to assure that the original POST request is properly UTF-8 encoded. The UrlEncodedFormEntity class also uses the default character encoding, which might not be UTF-8. Change this:

Источник

String encoding (UTF-8) JAVA

Could anyone please help me out here. I want to know the difference in below two string formatting. I am trying to encode the string to UTF-8. which one is the correct method.

ALSO if I use above two code together i.e.

Will the value of string1 will be the same in both the lines?

PS: Purpose of doing all this is to send Japanese text in web service call. So I want to send it with UTF-8 encoding.

3 Answers 3

According to the javadoc of String#getBytes(String charsetName) :

Encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.

And the documentation of String(byte[] bytes, Charset charset)

Constructs a new String by decoding the specified array of bytes using the specified charset.

Thus getBytes() is opposite operation of String(byte []) . The getBytes() encodes the string to bytes, and String(byte []) will decode the byte array and convert it to string. You will have to use same charset for both methods to preserve the actual string value. I.e. your second example is wrong:

String and char (two-bytes UTF-16) in java is for (Unicode) text.

When converting from and to byte[] s one needs the Charset (encoding) of those bytes.

Both String.getBytes() and new String(byte[]) are short cuts that use the default operating system encoding. That almost always is wrong for crossplatform usages.

Or better, not throwing an UnsupportedCharsetException:

(Android does not know StandardCharsets however.)

The same holds for InputStreamReader, OutputStreamWriter that bridge binary data (InputStream/OutputStream) and text (Reader, Writer).

Please don’t confuse yourself. «String» is usually used to refer to values in a datatype that stores text. In this case, java.lang.String .

Serialized text is a sequence of bytes created by applying a character encoding to a string. In this case, byte[] .

There are no UTF-8-encoded strings in Java.

Источник

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