Java 字符串特殊字符

Java 字符串特殊字符,java,encoding,Java,Encoding,我正在尝试正确计算此字符串的值: String s4 = "Entraîneur"; String s4a = new String(s4.getBytes("iso-8859-1")); 运行时的值为: EntraÃ?®neur 无法理解 感谢您正在创建一个字符串,其中一个编码为默认值,除非您另有指定,否则很可能是UTF-8,然后使用另一个不兼容的编码ISO 8859-1将其读回。这几乎总是会给任何非ansii字符带来问题,因为不同的编码用不同的字节序列表示这些字符 如果你想要一个糟糕的

我正在尝试正确计算此字符串的值:

String s4 = "Entraîneur";
String s4a = new String(s4.getBytes("iso-8859-1"));
运行时的值为:

Entra�®neur
无法理解


感谢您正在创建一个字符串,其中一个编码为默认值,除非您另有指定,否则很可能是UTF-8,然后使用另一个不兼容的编码ISO 8859-1将其读回。这几乎总是会给任何非ansii字符带来问题,因为不同的编码用不同的字节序列表示这些字符

如果你想要一个糟糕的类比,这有点像打印出一些拉丁语,然后把它传给只会说英语的人,然后问它是什么意思。你也许能解决其中的一些问题,但其他一些问题会被认为是胡说八道

如果将代码更改为使用默认字符集:

String s4 = "Entraîneur";
String s4a = new String(s4.getBytes(Charset.defaultCharset()));

…那么s4a应该包含正确的值。

预期的输出是什么?为什么不使用UTF8?Stringbyte[]bytes通过使用平台的默认字符集解码指定的字节数组来构造新字符串。因此,如果要传递正确的字符集,请使用Stringbyte[]bytes,Charset Charset。在Java中,UTF-16是本机字符串编码。@DPenner1仔细想想,这不只是Java的内部编码吗?我不认为这一定反映了运行时默认值。。。当然,不管默认编码是什么,答案基本上是一样的。我以前很熟悉这些东西…@DPenner1在Java中,文本通常表示为字符值序列。这与UTF-16不同,UTF-16与所有通用字符编码一样,没有Java字符的概念,只从字节和到字节进行转换。值得注意的是,有两种不同的UTF-16编码,每种端点一种。在Java中没有意义的概念。Java对文本的规范表示只提醒UTF-16,即使用相同的代理项对机制来表示大于U+FFFF的代码点字符。另外,在内部,Java计划允许自己在编码之间进行选择。@DPenner1实际上,就问题的目的而言,类字符串的用户不应该关心类字符串如何选择实现文本的表示。它完成了它的工作,它的工作与字符编码没有任何关系。特别是在Java11中,它们打算将ASCII兼容字符串表示为ASCII。我试图做出的区别是,UTF-16使用字节,Java使用字符。尽管如此,如果医生也选择这样解释,我不会争辩--°@kumesana仔细重读这个问题,我同意并删除了我以前的一些评论。我该去喝点咖啡了。。。