如何指定要使用哪个版本的UTF-8(Java)?

如何指定要使用哪个版本的UTF-8(Java)?,java,encoding,Java,Encoding,由于一些笨拙的遗留代码,我需要将一些非英语文本作为ansi/ascii字符串传递,这些字符串显然是UTF-8编码的。在大多数情况下,这是正常工作(我使用的是URLEncoder)。然而,现在我需要它能够在不同的环境下输出不同版本的UTF-8,我不知道如何做到这一点 例如,此字符可以通过以下方式进行UTF-8编码: 大 %u5927 大 %E5%A4%A7 但似乎没有人谈论不同的版本,好像没有什么不同。我知道URLEncoder不做第二个版本,因为&是一个保留字符,但在某些

由于一些笨拙的遗留代码,我需要将一些非英语文本作为ansi/ascii字符串传递,这些字符串显然是UTF-8编码的。在大多数情况下,这是正常工作(我使用的是URLEncoder)。然而,现在我需要它能够在不同的环境下输出不同版本的UTF-8,我不知道如何做到这一点

例如,此字符可以通过以下方式进行UTF-8编码:

大
%u5927
大
%E5%A4%A7
但似乎没有人谈论不同的版本,好像没有什么不同。我知道URLEncoder不做第二个版本,因为&是一个保留字符,但在某些情况下,第二个是我需要的。如何将文本转换为所需的特定版本


具体地说,它被传递给一个.jsp,其中包含一个名为displaytag的库,该库处理数据并显示一个表,而不需要开发人员进行大量输入,但它似乎没有任何设置编码的选项。我知道上面列表中的第二种编码(作为ansi/ascii传递)在不更改.jsp的情况下正确显示,这对我来说是最安全的选择。我只需要这样做。

第一个是十六进制的unicode代码点,是URL编码的,第二个是十进制的,是HTML/XML实体形式

从未将其用于您的目的,但我认为escapeHtml或escapeXml应该为您提供第二种形式

顺便说一句,第二种形式也有十六进制版本:


第三个看起来像是由一个非utf-8感知函数进行的转换,该函数转换了utf-8中分别构成单个代码点的三个字节。第三个在我看来是不正确的,因为你看不出它是三个ascii字节,还是它实际上是utf-8。

从我从问题中收集到的信息来看,你最终真正想做的就是显示文本

你已经知道,存储在内存或文件中的是字节序列,纯粹而简单,不知何故,你有三个字节序列e5 a4 a7,因为这就是字符OOKII HAJIME OOINI的方式(大) 是用UTF-8编码的

如果要使用Java将此字符放入URL,那么是的,您使用URLEncoder,您将获得%E5%A4%A7。但是如果您想在JSP上显示它,那么我肯定会推荐HTML实体
大;
,因为如果您决定d原始UTF-8字节

如何实现这一点取决于数据是以字节数组还是真正的Java字符串的形式存储。通常,要输出HTML数字实体,可以通过编程方式将代码点大于7F的每个字符转换为表单中的字符

& # x codepoint ;

或者在web上搜索一个库来为您实现这一点。如果您正在处理一个字节数组,可能需要更多的工作,但这是可以完成的。Commons Lang的StringEscapeUtils处理已知的命名实体,但我不相信它会为具有大代码点的字符创建数字HTML实体。

和#22823;
是HTML实体encoding,不是URL编码!就像
%u5927
一样,
%E5%A4%A7
是UTF8字符串的URL编码,而不是UTF8本身。@Gabe和@Dashwuff,我知道这一点,我意识到真正的UTF-8编码都在内存中,不是像这样显示的,但这个问题很难问,因为我不知道它周围的所有术语。而且,它不是这不是我问题的重点。或者你是说HTML实体编码与UTF-8编码不同?不管怎样,这都给了我另一个谷歌搜索的短语。如果在那之后我仍然感到困惑,我会回来重新表述我的问题。啊,谢谢。这正是我需要的。我理解这可能是一个奇怪的用法,如果这是我的问题我自己的项目根本不会这样处理。顺便说一句,第三个版本实际上是URLEncoder的输出。在需要它通过URL时非常有用。有趣的是,Chrome甚至会将它显示为它应该表示的字符,但只有当它是“=”或什么的后面的变量时。啊,“codepoint”这是一个很好学的术语,谢谢。StringEscapeUtils做我想做的事情。大概,它会检测它是否可以被命名。另外,有趣的是,如果你不将
大;
放在代码块中,它会显示为字符,就像我认为你在第三段的答案中发生的那样。嘿,明白了吗第三段的打字错误:-)很高兴StringEscapeUtils适合你!修正了我答案中的第三段。