为了账号安全,请及时绑定邮箱和手机立即绑定

这些符号是什么使网址解码器与 UTF-8 崩溃?

这些符号是什么使网址解码器与 UTF-8 崩溃?

qq_笑_17 2022-09-28 09:38:34
我正在使用URL解码器来解码字符串:import java.net.URLDecoder;URLDecoder.decode("%u6EDA%u52A8%u8F74%u627F", StandardCharsets.UTF_8.name());这导致坠机Exception in thread "main" java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "u6"    at java.net.URLDecoder.decode(URLDecoder.java:194)    at Playground$.delayedEndpoint$Playground$1(Playground.scala:45)    at Playground$delayedInit$body.apply(Playground.scala:10)    at scala.Function0$class.apply$mcV$sp(Function0.scala:34)    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)    at scala.App$$anonfun$main$1.apply(App.scala:76)    at scala.App$$anonfun$main$1.apply(App.scala:76)    at scala.collection.immutable.List.foreach(List.scala:392)    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)    at scala.App$class.main(App.scala:76)    at Playground$.main(Playground.scala:10)    at Playground.main(Playground.scala)它似乎是和不允许在字符串中。我试图阅读这些符号是什么,但我一直没有成功。我在数据集中名为“页面标题字段”的字段中找到了该字符串。所以我怀疑它们是编码符号,我只是不知道哪种编码。有谁知道这些符号是什么,我应该使用哪种编码来成功解码它们?%u6%u8
查看完整描述

2 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

看起来像一个非标准的基于UTF-16的“滚动轴承”编码,这是中文的“滚珠轴承”。


我建议只用反斜杠,然后从阿帕奇共享资源中使用:.replaceAll%uStringEscapeUtils


import org.apache.commons.lang3.StringEscapeUtils

val unescapedJava = StringEscapeUtils.unescapeJava(str.replaceAll("%u", "\\u"))

URLDecoder.decode(unescapedJava, StandardCharsets.UTF_8.name())

这应该处理这两种类型的转义:


后跟数字的正常转义序列不受替换和%unescapeJava

奇怪的被特殊对待(替换为),并在第一步中消除。%u\u

如果(仅当)您绝对确定所有代码点都以这种方式编码,那么您可以不这样做:StringEscapeUtils


new String(

  "%u6EDA%u52A8%u8F74%u627F"

  .replaceAll("%u", "")

  .grouped(4)

  .map(Integer.parseInt(_, 16).toChar)

  .toArray

)

它产生


res: String = 滚动轴承

但我建议不要这样做,因为这种方法会分解为包含未转义字符的输入。最好使用可靠的库方法来处理所有角落的情况。"%u6EDA%u52A8%u8F74%u627Fcafebabe"


查看完整回答
反对 回复 2022-09-28
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

您的字符串在语法上是错误的,因为是 URL 编码的字符串。根据URL解码器解码和维基百科的爪哇多克:百分比编码必须遵循两个十六进制数字。"%u6EDA%u52A8%u8F74%u627F"%

可能是你打算用的。这将是一个语法正确的 Java 字符串(具有 4 个十六进制转义 Unicode 字符),等效于 。但是,对此字符串进行 URL 解码仍然没有意义。因此,我猜错误已经发生在编码端,这首先产生了这个格式错误的URL编码字符串。"\u6EDA\u52A8\u8F74\u627F""滚动轴承"


查看完整回答
反对 回复 2022-09-28
  • 2 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号