由于一些笨拙的遗留代码,我需要传递一些非英文文本作为可见的UTF-8编码的ansi / ascii字符串。在大多数情况下,这是正常的(我正在使用URLEncoder)。但是,现在我需要能够在不同情况下输出不同版本的UTF-8,我不知道该怎么做。
例如,这个字符可以通过以下方式进行UTF-8编码:
大
%u5927
大
%E5%A4%A7
但似乎没有什么可以谈论不同的版本,好像没有区别。我知道URLEncoder没有做第二个版本,因为&是一个保留字符,但第二个是我在某些情况下需要的。如何将文本转换为我想要的特定版本?
具体来说,它被传递给一个.jsp,它包含一个名为displaytag的库,它处理数据并显示一个没有太多开发人员输入的表,但它似乎没有任何设置编码的选项。我知道上面列表中的第二个编码(作为ansi / ascii传递)正确显示而不更改.jsp,这对我来说是最安全的选项。我只需要这样做。
答案 0 :(得分:2)
首先是十六进制的unicode代码点,是URL编码,第二个是十进制相同的,是HTML / XML实体形式。
从未将它用于您的目的,但我认为StringEscapeUtils escapeHtml或escapeXml应该为您提供第二种形式。
BTW第二种形式也有十六进制版本:大
第三个看起来像是一个非utf-8感知函数的转换,它已经转换了utf-8中的三个字节,分别构成了单个代码点。第三个是在我看来不正确,因为你看不到它是三个ascii字节还是它实际上是utf-8。
答案 1 :(得分:0)
从我可以从问题中收集到的内容,你真正想要最终做的就是显示文字。
你已经知道存储在内存或文件中的是字节序列,纯粹而简单,不知何故你有三字节序列e5 a4 a7,因为这就是字符OOKII HAJIME OOINI(大)的方式。以UTF-8编码。
要使用Java将此字符放入URL,然后使用URLEncoder,您将获得%E5%A4%A7。但是如果你想在JSP上显示它,那么我肯定会推荐HTML实体大
,因为你不会受最终用户设置他们的浏览器的字符编码,如果你决定弄乱你的字节流发送原始UTF-8字节。
如何执行此操作取决于您的数据是存储为字节数组还是真正的Java字符串。通常,要输出HTML数字实体,可以通过将代码点高于7F的每个字符转换为表单字符来以编程方式执行此操作
& # x codepoint ;
或在网上搜索为您执行此操作的库。如果你正在处理一个字节数组,可能会有更多的工作,但它可以完成。 Commons Lang的StringEscapeUtils处理已知的命名实体,但我不相信它会为具有大代码点的字符创建数字HTML实体。