Codificar o texto para UTF-8
byte ptext[] = myString.getBytes();
String value = new String(ptext, "UTF-8");
como é que codifico esse texto para utf-8?
10 answers
String
os objetos em Java usam a codificação UTF-16 que não pode ser modificada.
A única coisa que pode ter uma codificação diferente é um byte[]
. Então, se você precisa de dados UTF-8, então você precisa de um byte[]
. Se você tem um String
que contém dados inesperados, então o problema está em algum lugar anterior que incorretamente converteu alguns dados binários para um String
(ou seja, ele estava usando a codificação errada).
Que tal usar
ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode(myString)
Utilizar byte[] ptext = String.getBytes("UTF-8");
em vez de getBytes()
. getBytes()
usa a chamada "codificação padrão", que pode não ser UTF-8.
Em Java7 pode usar:
import static java.nio.charset.StandardCharsets.*;
byte[] ptext = myString.getBytes(ISO_8859_1);
String value = new String(ptext, UTF_8);
Isto tem a vantagem sobre getBytes(String)
que não declara throws UnsupportedEncodingException
.
Se estiver a usar uma versão Java mais antiga, pode declarar as constantes de codificação por si próprio:
import java.nio.charset.Charset;
public class StandardCharsets {
public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
public static final Charset UTF_8 = Charset.forName("UTF-8");
//....
}
Uma cadeia de Java está sempre codificada internamente em UTF-16 - mas você realmente deve pensar sobre isso assim: uma codificação é uma maneira de traduzir entre cadeias e bytes.
Então se você tem um problema de codificação, quando você tem String, é tarde demais para corrigir. Você precisa corrigir o lugar onde você cria esse texto a partir de um arquivo, DB ou conexão de rede.
byte ptext[] = myString.getBytes("ISO-8859-1");
String value = new String(ptext, "UTF-8");
String value = new String(myString.getBytes("UTF-8"));
E, se quiser ler do ficheiro de texto com" ISO-8859-1 " codificado:
String line;
String f = "C:\\MyPath\\MyFile.txt";
try {
BufferedReader br = Files.newBufferedReader(Paths.get(f), Charset.forName("ISO-8859-1"));
while ((line = br.readLine()) != null) {
System.out.println(new String(line.getBytes("UTF-8")));
}
} catch (IOException ex) {
//...
}
Tenho de usar o código abaixo para codificar o carácter especial, especificando o formato do codificador.
String text = "This is an example é";
byte[] byteText = text.getBytes(Charset.forName("UTF-8"));
//To get original string from byte.
String originalString= new String(byteText , "UTF-8");
Primeiro preciso de importar
import java.nio.charset.Charset;
Depois tive de declarar uma constante para usar UTF-8
e ISO-8859-1
private static final Charset UTF_8 = Charset.forName("UTF-8");
private static final Charset ISO = Charset.forName("ISO-8859-1");
Então eu poderia usá-lo da seguinte maneira:
String textwithaccent="Thís ís a text with accent";
String textwithletter="Ñandú";
text1 = new String(textwithaccent.getBytes(ISO), UTF_8);
text2 = new String(textwithletter.getBytes(ISO),UTF_8);
String inputText = "some text with escaped chars"
InputStream is = new ByteArrayInputStream(inputText.getBytes("UTF-8"));