Sdscompany.ru

Компьютерный журнал
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java convert string to utf 8

Как конвертировать строки в массивы байтов UTF8 и обратно в Java

В Java у меня есть строка, и я хочу закодировать ее как массив байтов (в UTF8 или какой-то другой кодировке). Кроме того, у меня есть массив байтов (в некоторой известной кодировке), и я хочу преобразовать его в строку Java. Как мне сделать эти преобразования?

13 Ответов

Преобразование из строки в byte[]:

Преобразование из byte[] в строку:

Вы должны, конечно, использовать правильное имя кодировки. В моих примерах использовались US-ASCII и UTF-8, две наиболее распространенные кодировки.

Вот решение, которое позволяет избежать выполнения поиска кодировки для каждого преобразования:

Вы можете конвертировать непосредственно через конструктор String (byte[], String) и метод getBytes(String). Java предоставляет доступные наборы символов через класс Charset . В документации JDK перечислены поддерживаемые кодировки .

90% в большинстве случаев такие преобразования выполняются в потоках, поэтому вы можете использовать классы Reader / Writer . Вы не будете последовательно декодировать с помощью строковых методов произвольные потоки байтов — вы оставите себя открытым для ошибок, связанных с многобайтовыми символами.

Моя реализация tomcat7 принимает строки как ISO-8859-1; несмотря на тип содержимого запроса HTTP. Следующее решение сработало для меня, когда я пытался правильно интерпретировать символы, такие как ‘é’ .

При попытке интерпретировать строку как US-ASCII информация о байте была неправильно интерпретирована.

В качестве альтернативы можно использовать StringUtils из Apache Commons.

Если у вас есть нестандартная кодировка, вы можете использовать getBytesUnchecked() или newString() соответственно.

Для декодирования серии байтов в обычное строковое сообщение я, наконец, получил его, работая с UTF-8 кодировкой с этим кодом:

Если вы используете 7-битный ASCII или ISO-8859-1 (удивительно распространенный формат), то вам вообще не нужно создавать новый java.lang.String . Это гораздо более производительным, чтобы просто бросить байт в Чаре:

Полный рабочий пример:

Если вы не используете расширенные символы , такие как Ä, Æ, Å, Ç, Ï, Ê, и можете быть уверены, что только переданные значения относятся к первым 128 символам Юникода, то этот код также будет работать для UTF-8 и расширенного ASCII (например, cp-1252).

Я не могу комментировать, но и не хочу начинать новую тему. Но это не работает. Простая поездка туда и обратно:

Мне бы понадобился b[] тот же массив до и после кодирования, которым он не является (это отсылает к первому ответу).

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

Похожие вопросы:

Мне нужно преобразовать массив байтов в строку UTF8 и сохранить символы в массиве. Im загружает изображение с помощью multipart post. Изображение передается в виде строки UTF8. Я сравнил заголовки.

Я использую .net -порт libsodium . Функция генерации hash имеет две формы: одну, которая принимает массивы байтов, и другую, которая принимает строки: public static byte[] ArgonHashBinary(string.

Я пытаюсь это сделать: Создайте массив байтов. Преобразовать массив байтов в base64 Преобразуйте эту строку base64 обратно в массив байтов. Я опробовал несколько решений, например, в этом вопросе .

Как получить поток байтов и конвертировать обратно в изображение, ниже приведен мой код. Но изображения, которые я получаю, пусты. Почему? Что-то не так с кодом? Я получаю байты из моего.

Есть много вопросов с этой темой, одно и то же решение, но это не работает для меня. У меня есть простой тест с шифрованием. Само шифрование / расшифровка работает (пока я обрабатываю этот тест с.

У меня есть некоторые файлы, которые содержат строки и должны конвертировать их в UTF8 с perl есть ли какой-либо вариант с perl, чтобы запустить эти файлы и конвертировать каждую строку в utf8, и.

У меня есть проект Blackberry, над которым я работаю, и мне нужно преобразовать массивы байтов строк, закодированных с помощью UTF-16LE (little endian), в массив байтов строки в кодировке UTF-16BE.

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

У меня есть некоторые данные в базе данных, показывая, как показано ниже: ÃÃà ñÉé Судя по этому ø должно быть Ÿ . Я не уверен в нескольких вещах, но до сих пор мое исследование, похоже.

Читать еще:  Java lang illegalstateexception ora 20001

Я читаю файл в массив байтов и преобразую массив байтов в строку для передачи в метод (я не могу передать сам массив байтов), и в определении функции я повторно преобразую строку в массив байтов. но.

Установка кодировки символов Java по умолчанию?

Как правильно установить кодировку символов по умолчанию, используемую JVM (1.5.х) программно?

Я читал, что -Dfile.encoding=whatever раньше был способ пойти для старых JVMs. У меня нет такой роскоши по причинам, в которые я не хочу вдаваться.

и свойство устанавливается, но это, похоже, не вызывает окончательный вызов getBytes ниже, чтобы использовать UTF8:

15 ответов

к сожалению, file.encoding свойство должно быть указано при запуске JVM; к моменту ввода основного метода кодировка символов, используемая String.getBytes() и конструкторы по умолчанию InputStreamReader и OutputStreamWriter постоянно кэшируется.

As Эдвард грех указывает, в частном случае, как это, переменная окружения JAVA_TOOL_OPTIONS can используется для указания этого свойства, но обычно это делается так это:

Charset.defaultCharset() будет отражать изменения file.encoding свойство, но большинство кода в основных библиотеках Java, которые должны определить кодировку символов по умолчанию, не используют этот механизм.

когда вы кодируете или декодируете, вы можете запросить file.encoding собственность или Charset.defaultCharset() чтобы найти текущую кодировку по умолчанию и использовать соответствующий метод или перегрузку конструктора, чтобы указать ее.

поскольку командная строка не всегда может быть доступна или изменена, например, во встроенных VMs или просто VMs, запущенных глубоко в сценариях, a JAVA_TOOL_OPTIONS переменная предоставляется так, что агенты могут быть запущены в этих случаях.

установив переменную среды (Windows) JAVA_TOOL_OPTIONS до -Dfile.encoding=UTF8 , (Java) System свойство будет устанавливаться автоматически при каждом запуске JVM. Вы будет знать, что параметр был выбран, потому что следующее сообщение будет опубликовано на System.err :

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8

У меня есть хакерский способ, который определенно работает!!

таким образом, вы собираетесь обмануть JVM, который будет думать, что charset не установлен и сделать это, чтобы установить его снова в UTF-8, во время выполнения!

Я думаю, что лучший подход, чем установка набора символов платформы по умолчанию, тем более, что у вас, похоже, есть ограничения на влияние на развертывание приложения, не говоря уже о платформе, — это вызвать гораздо более безопасный String.getBytes(«charsetName») . Таким образом, ваше приложение не зависит от вещей, находящихся вне его контроля.

Я лично считаю, что String.getBytes() должно быть устаревшим, так как это вызвало серьезные проблемы в ряде случаев, которые я видел, когда разработчик не учитывал значение по умолчанию кодировка, возможно, меняется.

Я не могу ответить на ваш первоначальный вопрос, но я хотел бы предложить вам несколько советов-не зависите от кодировки JVM по умолчанию. Всегда лучше явно указать желаемую кодировку (например,» UTF-8″) в вашем коде. Таким образом, вы знаете, что он будет работать даже в разных системах и конфигурациях JVM.

How to write UTF-8 encoded data into a file – Java

Here’s the Java example to demonstrate how to write UTF-8 encoded data into a text file – “c:\temp\test.txt

P.S Symbol “??” is some “UTF-8” data in Chinese and Japanese

Result

mkyong

Comments

Thank you so much, It works fine for me… Its very helpful.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class TestData <
public static void main(String[] args) <

try <
File fileDir = new File(
“C:\Migration\DateFormatConvert\tamil.html”);
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream(fileDir), “UTF8”));
String str;

File outFileDir = new File(“C:\Migration\DateFormatConvert\tamil_out.html”);
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFileDir), “UTF8”));

while ((str = in.readLine()) != null) <
System.out.println(str);
out.append(str).append(“rn”);
>

out.flush();
out.close();
> catch (Exception e) <
System.out.println(e.getMessage());
>
>
>

[…] P.S File is created by this article How to write UTF-8 encoded data into a file – Java […]

Hello there, This code does not really work for me. Here’s how I tested it. My test.txt file is saved with UTF-8 encoding and contains this line: ————— w Г©tГ© jedn? stron? ГґpГЁГ§ Г›g ГјtГ ————— My test program below first reads the file in BufferedReader and then writes in Writer. ————— package test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.io.Writer; public class Test_temp < public Test_temp() < String sPath = “E:/workspace/project/src/test/test.txt”; if (sPath != null && !sPath.trim().equals(“”)) < try < Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(sPath + … Read more »

Читать еще:  Javascript обработчик формы

are you sure that you’re using a UTF-( reader to validate the file?

String UTF8Str = new String(s.getBytes(), “UTF8?);

ShouldBE? String UTF8Str = new String(s.getBytes(“UTF8?));

Code ain’t working for me may be because of this : http://stackoverflow.com/a/4053854

Please provide another working solution asap. I guess there is something in Apache Commons for the same.

You should close the streams in Finally blocks . The correct code is :

2 Examples to Convert Byte[] Array to String in Java

Converting a byte array to String seems easy but what is difficult is, doing it correctly. Many programmers make mistake of ignoring character encoding whenever bytes are converted into a String or char or vice versa. As a programmer, we all know that computer’s only understand binary data i.e. 0 and 1 . All things we see and use e.g. images, text files, movies, or any other multi-media is stored in form of bytes, but what is more important is process of encoding or decoding bytes to character. Data conversion is an important topic on any programming interview, and because of trickiness of character encoding, this questions is one of the most popular String Interview question on Java Interviews. While reading a String from input source e.g. XML files, HTTP request, network port, or database, you must pay attention on which character encoding (e.g. UTF-8, UTF-16, and ISO 8859-1) they are encoded. If you will not use the same character encoding while converting bytes to String, you would end up with a corrupt String which may contain totally incorrect values. You might have seen ? , square brackets after converting byte[] to String, those are because of values your current character encoding is not supporting, and just showing some garbage values.

I tried to understand why programmes make character encoding mistakes more often than not, and my little research and own experience suggests that, it may be because of two reasons, first not dealing enough with internationalization and character encodings and second because ASCII characters are supported by almost all popular encoding schemes and has same values. Since we mostly deal with encoding like UTF-8 , Cp1252 and Windows-1252 , which displays ASCII characters (mostly alphabets and numbers) without fail, even if you use different encoding scheme. Real issue comes when your text contains special characters e.g. ‘é’ , which is often used in French names. If your platform’s character encoding doesn’t recognize that character then either you will see a different character or something garbage, and sadly until you got your hands burned, you are unlikely to be careful with character encoding. In Java, things are little bit more tricky because many IO classes e.g. InputStreamReader by default use platform’s character encoding. What this means is that, if you run your program in different machine, you will likely get different output because of different character encoding used on that machine. In this article, we will learn how to convert byte[] to String in Java both by using JDK API and with the help of Guava and Apache commons.

How to convert byte[] to String in Java

There are multiple ways to change byte array to String in Java, you can either use methods from JDK, or you can use open source complimentary APIs like Apache commons and Google Guava. These API provides at least two sets of methods to create String form byte array; one, which uses default platform encoding and other which takes character encoding. You should always use later one, don’t rely on platform encoding. I know, it could be same or you might not have faced any problem so far, but it’s better to be safe than sorry. As I pointed out in my last post about printing byte array as Hex String, It’s also one of the best practice to specify character encoding while converting bytes to character in any programming language. It might be possible that your byte array contain non-printable ASCII characters. Let’s first see JDK’s way of converting byte[] to String :

Читать еще:  Java security signatureexception invalid file sign

1) You can use constructor of String, which takes byte array and character encoding

This is the right way to convert bytes to String, provided you know for sure that bytes are encoded in the character encoding you are using.

2) If you are reading byte array from any text file e.g. XML document, HTML file or binary file, you can use the Apache Commons IO library to convert the FileInputStream to a String directly. This method also buffers the input internally, so there is no need to use another BufferedInputStream.

In order to correctly convert those byte array into String, you must first discover correct character encoding by reading meta data e.g. Content-Type , etc, depending on the format/protocol of the data you are reading. This is one of the reason I recommend to use XML parsers e.g. SAX or DOM parsers to read XML files, they take care of character encoding by themselves.

Some programmers, also recommends to use Charset over String for specifying character encoding, e.g. instead of «UTF-8» use StandardCharsets.UTF_8 mainly to avoid UnsupportedEncodingException in worst case. There are six standard Charset implementations guaranteed to be supported by all Java platform implementations. You can use them instead specifying encoding scheme in String. In short, always prefer StandardCharsets.ISO_8859_1 over «ISO_8859_1» , as shown below :

Other standard charset supported by Java platform are :

  1. StandardCharsets.ISO_8859_1
  2. StandardCharsets.US_ASCII
  3. StandardCharsets.UTF_16
  4. StandardCharsets.UTF_16BE
  5. StandardCharsets.UTF_16LE

If you are reading bytes from input stream, you can also check my earlier post about 5 ways to convert InputStream to String in Java for details.

Original XML
Here is our sample XML snippet to demonstrate issues with using default character encoding. This file contains letter ‘é’ , which is not correctly displayed in Eclipse because it’s default character encoding is Cp1252.

And, this is what happens when you convert a byte array to String without specify character encoding, e.g. :

This will use platform’s default character encoding, which is Cp1252 in this case, because we are running this program in Eclipse IDE. You can see that letter ‘é’ is not displayed correctly.

To fix this, specify character encoding while creating String from byte array, e.g.

By the way, let me make it clear that even though I have read XML files using InputStream here it’s not a good practice, in fact it’s a bad practice. You should always use proper XML parsers for reading XML documents. If you don’t know how, please check this tutorial. Since this example is mostly to show you why character encoding matters, I have chosen an example which was easily available and looks more practical.

Java Program to Convert Byte array to String in Java

Here is our sample program to show why relying on default character encoding is a bad idea and why you must use character encoding while converting byte array to String in Java. In this program, we are using Apache Commons IOUtils class to directly read file into byte array. It takes care of opening/closing input stream, so you don’t need to worry about leaking file descriptors. Now how you create String using that array, is the key. If you provide right character encoding, you will get correct output otherwise a nearly correct but incorrect output.

Things to remember and Best Practices

Always remember, using character encoding while converting byte array to String is not a best practice but mandatory thing. You should always use it irrespective of programming language. By the way, you can take note of following things, which will help you to avoid couple of nasty issues :

Ссылка на основную публикацию
Adblock
detector