Tengo una Cadena con una «ñ» carácter y tengo algunos problemas con él. Necesito codificar esta Cadena para la codificación UTF-8. He probado de esta manera, pero no funciona:

byte ptext[] = myString.getBytes();
String value = new String(ptext, "UTF-8");

¿Cómo puedo codificar esa cadena de caracteres a utf-8?

  • No está claro qué es exactamente lo que estamos tratando de hacer. ¿MyString correctamente contener la ñ personaje y tienes problemas para convertirla en una matriz de bytes (en ese caso ver las respuestas de Pedro y Amir), o es myString dañado y estamos tratando de solucionarlo (en ese caso, ver las respuestas de Joaquín y a mí)?
  • Necesito enviar myString a un servidor con la codificación utf-8 y que necesito para convertir la «ñ» de caracteres para la codificación utf-8.
  • Bien, si ese servidor espera UTF-8, a continuación, lo que usted necesita para enviar son bytes, no una Cadena. Así como por la respuesta de Pedro, especificar la codificación en la primera línea y la caída de la segunda línea.
  • Estoy de acuerdo en que no es claro cuál es la verdadera intención es aquí. Parece ser que hay un montón de preguntas donde la gente está tratando de las conversiones explícitas entre Cadenas de caracteres y bytes en lugar de dejar que el {In,Out}putStream{Read,Writ}ers hacerlo por ellos. Me pregunto ¿por qué?
  • mi conjetura es que esas preguntas son formuladas por personas cuya experiencia anterior con lenguajes como C o PHP en una cadena es básicamente la misma cosa como una matriz de bytes y tiene que seguir su codificación por separado (y convertir una cadena a partir de una codificación a otra tiene significado).
  • Gracias, supongo que tiene sentido. Pero también hace que sea más difícil de lo que debe ser, ¿no? Yo no soy muy amante de los idiomas que funciona de esa manera, y así tratar de evitar el trabajo con ellos. Creo que Java del modelo de Cadenas de caracteres en lugar de bytes que hace las cosas mucho más fácil. Perl y Python también comparten el «todo está cadenas Unicode» del modelo. Sí, en todos los tres todavía se puede conseguir en bytes si se trabaja bien, pero en la práctica parece raro que usted realmente necesita: eso es muy bajo nivel. Además de que se siente un poco como el cepillado de un gato en la dirección equivocada, si usted sabe a qué me refiero. 🙂
  • Estoy totalmente de acuerdo en que una fuerte cadena de abstracción es una cosa muy buena. Pero la C es de un tiempo largo antes de Unicode existido, cuando no había ninguna codificación único que podría representar todos los caracteres, y cuando cualquier tipo de abstracción más pura bytes habría sido intolerable penalización de rendimiento. Los programadores de Java suerte que se adapta Unicode relativamente bien desde el principio. Perl y Python son de mayor edad y tenían soporte Unicode readaptación, que hace que sea mucho menos limpio (explícita str/unicode dualidad en Python, desagradable implícito UTF-8 bandera en Perl.
  • El Python dualidad es bastante molesto; siempre estoy olvidando /u en Python; mismo problema con PHP. Con Perl 5.14, ahora en RC1 de prueba puede finalmente get todas las cadenas Unicode. Expresiones regulares de Perl son todavía mucho más Unicode-friendly de Java, pero he estado trabajando con el JDK7 la gente para arreglar eso.
  • posibles duplicados de Cómo convertir Cadenas a y desde UTF8 matrices de bytes de Java

InformationsquelleAutor Alex | 2011-04-20

11 Comentarios

  1. 129

    String objetos en Java utilizan la codificación UTF-16 que no puede ser modificada.

    La única cosa que puede tener una codificación diferente es un byte[]. Así que si usted necesita datos de UTF-8, entonces usted necesita un byte[]. Si usted tiene un String que contiene datos inesperados, entonces el problema es que en algunos de los anteriores, el lugar que convierte incorrectamente algunos datos binarios a un String (es decir, fue el uso de la codificación incorrecta).

    • Técnicamente hablando, byte[] no tiene ningún tipo de codificación. Matriz de bytes ADEMÁS de la codificación puede dar de cadena de aunque.
    • verdadero. Pero adjuntar una codificación que sólo tiene sentido para byte[], no tiene sentido para String (a menos que la codificación es UTF-16, en el que caso tiene sentido, pero todavía información innecesaria).
    • String objects in Java use the UTF-16 encoding that can't be modified. ¿Tiene usted una fuente oficial de esta cita?
    • href=»https://docs.oracle.com/javase/10/docs/api/java/lang/Character.html#unicode» >docs.oracle.com/javase/10/docs/api/java/lang/… : «La plataforma Java se utiliza la representación UTF-16 char en matrices y en el String y StringBuffer clases».
  2. 163

    Cómo sobre el uso de

    ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode(myString)
    • Véase mi discusión con Pedro. Pero si su suposición acerca de la cuestión es correcta, la solución no sería todavía ser idea, ya que devuelve un ByteBuffer.
    • Pero, ¿cómo puedo obtener una Cadena codificada? devuelve un ByteBuffer
    • es no es posible para tener una codificación UTF-8 de Java Cadena. Desea bytes, así que usa el ByteBuffer directamente (incluso podría ser la mejor solución si su objetivo es enviar a través de una red de recogida) o llame array() para obtener un byte[]
    • Bueno, corto y al punto… por supuesto, necesita algunos pasos adicionales: new String(java.de nio.conjunto de caracteres.Conjunto de caracteres.forName(«UTF-8»).codificar(micadena).array())
    • Algo que puede ser útil es el uso de la Guayaba de conjuntos de caracteres.UTF_8 enum en lugar de una Cadena que puede producir una UnsupportedEncodingException. Cadena -> bytes: myString.getBytes(Charsets.UTF_8), y bytes -> Cadena: new String(myByteArray, Charsets.UTF_8).
    • Mejor aún, utilice StandardCharsets.UTF_8. Disponible en Java 1.7+.

  3. 73

    En Java7 puede utilizar:

    import static java.nio.charset.StandardCharsets.*;
    
    byte[] ptext = myString.getBytes(ISO_8859_1); 
    String value = new String(ptext, UTF_8); 

    Esto tiene la ventaja sobre getBytes(String) que no declare throws UnsupportedEncodingException.

    Si usted está usando una vieja versión de Java puede declarar el conjunto de caracteres constantes de sí mismo:

    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");
        //....
    }
    • Esta es la respuesta correcta. Si alguien quiere usar un tipo de cadena, se puede utilizar en el formato correcto. Resto de las respuestas se apunta a que el byte de formato tipo.
    • Esto funciona para Java 6 también
    • Obras en 6. Gracias.
    • Respuesta correcta para mí también. Una cosa sin embargo, cuando la usé como en el anterior, en alemán el carácter cambiado ?. Así que, he utilizado este: byte[] ptext = myString.getBytes(UTF_8); String valor = new String(ptext, UTF_8); Esto ha funcionado muy bien.
    • Eso es impresionante . a mí me funcionó.
    • El código de ejemplo no tiene sentido. Si necesita convertir a ISO-8859-1, entonces la matriz de bytes es no UTF-8, por lo que la siguiente línea es totalmente incorrecto. Va a trabajar para cadenas de caracteres ASCII, por supuesto, pero entonces se podría hacer una simple copia: String value = new String(myString);.

  4. 70

    Uso byte[] ptext = String.getBytes("UTF-8"); en lugar de getBytes(). getBytes() utiliza lo que se denomina «codificación predeterminada», que no puede ser UTF-8.

    • claramente está teniendo problemas para conseguir bytes de la cadena. Cómo es el método getBytes(codificación) falta el punto? Creo que la segunda línea es no sólo para comprobar si se puede convertir de nuevo.
    • Yo lo interpreto como que tiene una Cuerda rota, y tratando de «arreglar» mediante la conversión de bytes y de la espalda (malentendido común). No hay indicación de que la segunda línea es sólo comprobar el resultado.
    • no, no existen, es sólo mi interpretación. La suya es, simplemente, diferente.
    • tienes razón, nos gustaría que nos necesitan aclaración de Alex lo que realmente significa. No puede rescindir el downvote aunque menos que la respuesta es editado…
    • Parece que ambos estaban medio mal y la mitad derecha…
  5. 31

    Java Cadena es internamente siempre codificado en UTF-16 – pero usted realmente debe pensar en ello como esto: una codificación es una forma de traducir entre Cadenas de caracteres y bytes.

    Así que si usted tiene un problema de codificación, por el tiempo que tiene la Cadena, es demasiado tarde para corregir. Usted necesita fijar el lugar donde se cree que la Cadena de un archivo, base de datos o una conexión de red.

    • Es un error común creer que las cadenas son internamente codificado como UTF-16. Generalmente lo son, pero si, es sólo una aplicación específica detalle de la clase String. Desde el almacenamiento interno de los datos de carácter no es accesible a través de la API pública, una Cadena específica de aplicación puede decidir el uso de cualquier otra codificación.
    • La API explícitamente a los estados a «Una Cadena que representa una cadena en el formato UTF-16». El uso de cualquier otro formato interno sería altamente ineficiente, y todas las implementaciones reales sé que hacer uso de UTF-16 internamente. Por lo menos que se puede citar a uno que no, estás haciendo bastante absurdo nimiedades.
    • Es absurdo distinguir entre el acceso del público y la representación interna de las estructuras de datos?
    • así que puede usted dar un ejemplo de una JVM que no internamente representan Cadenas de caracteres UTF-16?
    • La JVM (en la medida en que sea relevante para la VM en todos) utiliza la codificación UTF-8 para la codificación de cadena, por ejemplo, en los archivos de clase. La aplicación de java.lang.La cadena está desacoplado de la JVM y fácilmente se podría implementar la clase para que el uso de cualquier otra codificación para la representación interna si que es realmente necesario para que usted pueda darse cuenta de que su respuesta es incorrecta. El uso de UTF-16, así como el formato interno es, en la mayoría de los casos, altamente ineficiente así cuando se trata de consumo de memoria y no veo por qué por ejemplo, las implementaciones Java para hardware embebido no optimizar la memoria en lugar de desempeño.
    • Y una vez más: mientras que usted no puede dar un ejemplo concreto de una JVM, cuyo estándar de la API de la aplicación no usar internamente algo que no sea UTF-16 para implementar Cadenas, mi afirmación es correcta. Y no, la clase String no está realmente desvinculado de la JVM, debido a cosas como pasante() y la constante de la piscina.

  6. 23

    Usted puede tratar de esta manera.

    byte ptext[] = myString.getBytes("ISO-8859-1"); 
    String value = new String(ptext, "UTF-8"); 
    • Me estaba volviendo loco. Gracias a obtener los bytes en «ISO-8859-1» primero fue la solución.
    • Esto es incorrecto. Si la cadena incluye caracteres Unicode, la conversión de 8859-1 va a lanzar una excepción o peor a dar una cadena no válida (tal vez la cadena sin los caracteres con el código de punto de 0x100 y más).
  7. 11

    Que en un momento me pasó por este problema y se las arregló para resolverlo de la siguiente manera

    primero necesito para importar

    import java.nio.charset.Charset;

    Luego tuve que declarar una constante, el uso de UTF-8 y ISO-8859-1

    private static final Charset UTF_8 = Charset.forName("UTF-8");
    private static final Charset ISO = Charset.forName("ISO-8859-1");

    Entonces yo podría utilizar de la siguiente manera:

    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);
    • la solución perfecta.
  8. 9
    String value = new String(myString.getBytes("UTF-8"));

    y, si quieres leer desde el archivo de texto con el «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) {
        //...
    }
  9. 3

    Tengo uso a continuación el código para codificar el carácter especial mediante la especificación de codificar el formato.

    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");
  10. 1

    Un rápido paso a paso guía de cómo configurar NetBeans por defecto la codificación UTF-8. En consecuencia NetBeans creará todos los archivos nuevos en la codificación UTF-8.

    NetBeans por defecto la codificación UTF-8 paso a paso guía de

    • Ir a la carpeta etc en NetBeans directorio de instalación
    • Edición de netbeans.conf archivo de
    • Encontrar netbeans_default_options línea
    • Agregar -J-Dfile.encoding=UTF-8 dentro de comillas dentro de esa línea de

      (ejemplo: netbeans_default_options="-J-Dfile.encoding=UTF-8")

    • Reiniciar NetBeans

    Establece NetBeans por defecto la codificación UTF-8.

    Su netbeans_default_options puede contener parámetros adicionales dentro de las comillas. En tal caso, el add-J-Dfile.encoding=UTF-8 en el final de la cadena. Independiente con espacio de otros parámetros.

    Ejemplo:

    netbeans_default_options=»-J-cliente -J-Xss128m -J-Xms256m
    -J-XX:PermSize=32m -J-Tordillo.laf.useScreenMenuBar=true -J-Tordillo.awt.gráficos.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true -J-Dfile.encoding=UTF-8″

    aquí es el link para Más Detalles

  11. -1

    Esta solucionado mi problema

        String inputText = "some text with escaped chars"
        InputStream is = new ByteArrayInputStream(inputText.getBytes("UTF-8"));

Dejar respuesta

Please enter your comment!
Please enter your name here