将字符串编码为UTF-8

Ale*_*lex 176 java utf-8

我有一个带有"ñ"字符的字符串,我遇到了一些问题.我需要将此String编码为UTF-8编码.我通过这种方式尝试过,但它不起作用:

byte ptext[] = myString.getBytes();
String value = new String(ptext, "UTF-8");
Run Code Online (Sandbox Code Playgroud)

如何将该字符串编码为utf-8?

Ami*_*hum 165

如何使用

ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode(myString)
Run Code Online (Sandbox Code Playgroud)

  • 更好的是,使用`StandardCharsets.UTF_8`.适用于Java 1.7+. (23认同)
  • 但是我如何获得编码的字符串?它返回一个ByteBuffer (8认同)
  • @Alex:*不可能*拥有UTF-8编码的Java字符串.你想要字节,所以要么直接使用ByteBuffer(如果你的目标是通过网络集合发送它,甚至可能是最好的解决方案)或者在它上面调用array()来得到一个byte [] (6认同)
  • 其他可能有用的是使用Guava的Charsets.UTF_8枚举而不是可能抛出UnsupportedEncodingException的String.String - > bytes:`myString.getBytes(Charsets.UTF_8)`,和bytes - > String:`new String(myByteArray,Charsets.UTF_8)`. (2认同)

Joa*_*uer 131

String Java中的对象使用无法修改的UTF-16编码.

唯一可以有不同编码的是a byte[].因此,如果您需要UTF-8数据,那么您需要一个byte[].如果你有一个String包含意外数据的问题,那么问题是在一些错误地将某些二进制数据转换为a的某个较早的位置String(即它使用了错误的编码).

  • 从技术上讲,byte []没有任何编码.字节数组PLUS编码虽然可以给你字符串. (84认同)
  • “ Java中的字符串对象使用无法修改的UTF-16编码。”您是否提供此引文的官方资料? (3认同)
  • @AhmadHajjar https://docs.oracle.com/javase/10/docs/api/java/lang/Character.html#unicode:“Java平台在char数组以及String和StringBuffer类中使用UTF-16表示”。 (2认同)

rzy*_*mek 75

在Java7中,您可以使用:

import static java.nio.charset.StandardCharsets.*;

byte[] ptext = myString.getBytes(ISO_8859_1); 
String value = new String(ptext, UTF_8); 
Run Code Online (Sandbox Code Playgroud)

这具有优势,getBytes(String)而不是它没有声明throws UnsupportedEncodingException.

如果您使用的是较旧的Java版本,则可以自己声明charset常量:

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");
    //....
}
Run Code Online (Sandbox Code Playgroud)

  • 代码示例没有意义。如果您首先转换为 ISO-8859-1,则该字节数组**不是** UTF-8,因此下一行完全不正确。当然,它适用于 ASCII 字符串,但您也可以制作一个简单的副本:“String value = new String(myString);”。 (4认同)
  • 这是正确的答案.如果有人想使用字符串数据类型,他可以使用正确的格式.其余的答案指向字节格式化的类型. (2认同)

Pet*_*aný 72

byte[] ptext = String.getBytes("UTF-8");而不是getBytes().getBytes()使用所谓的"默认编码",它可能不是UTF-8.

  • @Michael:他显然无法从字符串中获取字节.getBytes(编码)如何忽略这一点?我认为第二行是为了检查他是否可以将其转换回来. (8认同)

Mic*_*rdt 31

Java String在内部总是以UTF-16编码 - 但你真的应该这样想:编码是一种在字符串和字节之间进行转换的方法.

因此,如果您遇到编码问题,那么当您使用String时,修复就太晚了.您需要修复从文件,数据库或网络连接创建该String的位置.

  • JVM(根据它与VM完全相关)使用UTF-8进行字符串编码,例如在类文件中.java.lang.String的实现与JVM分离,我可以使用任何其他编码为内部表示轻松地为您实现该类,如果您真的有必要意识到您的答案是不正确的.在大多数情况下,使用UTF-16作为内部格式在内存消耗方面也非常低效,我不明白为什么例如嵌入式硬件的Java实现不会优化内存而不是性能. (4认同)
  • @jarnbjo:API明确声明"字符串表示UTF-16格式的字符串".使用其他任何东西作为内部格式将是非常低效的,并且我知道的所有实际实现都在内部使用UTF-16.因此,除非你能引用一个没有的东西,否则你会进行非常荒谬的脱毛. (3认同)

小智 23

你可以试试这种方式.

byte ptext[] = myString.getBytes("ISO-8859-1"); 
String value = new String(ptext, "UTF-8"); 
Run Code Online (Sandbox Code Playgroud)

  • 这是错误的。如果您的字符串包含 Unicode 字符,则将其转换为 8859-1 将引发异常,或更糟的是会给出无效字符串(可能是不包含代码点 0x100 及以上字符的字符串)。 (2认同)

Qui*_*mbo 12

过了一会儿,我经历了这个问题,并设法通过以下方式解决了这个问题

首先我需要导入

import java.nio.charset.Charset;
Run Code Online (Sandbox Code Playgroud)

然后我不得不宣布一个恒定的使用UTF-8ISO-8859-1

private static final Charset UTF_8 = Charset.forName("UTF-8");
private static final Charset ISO = Charset.forName("ISO-8859-1");
Run Code Online (Sandbox Code Playgroud)

然后我可以通过以下方式使用它:

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);
Run Code Online (Sandbox Code Playgroud)


小智 9

String value = new String(myString.getBytes("UTF-8"));
Run Code Online (Sandbox Code Playgroud)

并且,如果您想从带有"ISO-8859-1"编码的文本文件中读取:

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) {
    //...
}
Run Code Online (Sandbox Code Playgroud)