gpt4 book ai didi

java - ISO-8858-1 到 UTF-8 仅在 URL 中,仅无效字符

转载 作者:行者123 更新时间:2023-12-01 18:01:38 25 4
gpt4 key购买 nike

问题:有时我们会收到(对我们而言)编码无效的链接/短语。

下面的示例和我的第一个解决方案

描述:我必须修复应用程序一部分中的无效编码字符串。有时它是一个单词或短语,但有时也是一个网址。当它是一个 URL 时,我只想更改编码错误的字符。如果我使用 ISO 解码并编码为 UTF-8,则特殊 url 字符也会被编码 (/: ? = &)。我编写了一个解决方案,它对我的​​情况工作得很好,但是你在下面看到的那些哈希值对我来说很难闻。

您是否遇到过类似的问题,或者您是否知道一个允许解码除某些字符之外的短语的库?像这样的事情:

decode(String value, char[] ignored)

我也考虑过将 URL 分成几部分并仅修复路径和查询,但解析它们等会更加困惑。

TLDR:解码 ISO-8858-1 编码的 URL 并将其编码为 UTF-8。不要触摸 URL 特定字符 (/? = : &)

输入/输出示例:

// wrong input
"http://some.url/xxx/a/%e4t%fcr%E4/b/%e4t%fcr%E4"
"t%E9l%E9phone"

// good output
"http://some.url/xxx/a/%C3%A4t%C3%BCr%C3%A4/b/%C3%A4t%C3%BCr%C3%A4"
"t%C3%A9l%C3%A9phone"

// very wrong output
"http%3A%2F%2Fsome.url%2Fxxx%2Fa%2F%C3%A4t%C3%BCr%C3%A4%2Fb%2F%C3%A4t%C3%BCr%C3%A4"

我的第一个解决方案:

class EncodingFixer {
private static final String SLASH_HASH = UUID.randomUUID().toString();
private static final String QUESTION_HASH = UUID.randomUUID().toString();
private static final String EQUALS_HASH = UUID.randomUUID().toString();
private static final String AND_HASH = UUID.randomUUID().toString();
private static final String COLON_HASH = UUID.randomUUID().toString();

EncodingFixer() {
}

String fix(String value) {
if (isBlank(value)) {
return value;
}
return tryFix(value);
}

private String tryFix(String str) {
try {
String replaced = replaceWithHashes(str);
String fixed = java.net.URLEncoder.encode(java.net.URLDecoder.decode(replaced, ISO_8859_1), UTF_8);
return replaceBack(fixed);
} catch (Exception e) {
return str;
}
}

private String replaceWithHashes(String str) {
return str
.replaceAll("/", SLASH_HASH)
.replaceAll("\\?", QUESTION_HASH)
.replaceAll("=", EQUALS_HASH)
.replaceAll("&", AND_HASH)
.replaceAll(":", COLON_HASH);
}

private String replaceBack(String fixed) {
return fixed
.replaceAll(SLASH_HASH, "/")
.replaceAll(QUESTION_HASH, "?")
.replaceAll(EQUALS_HASH, "=")
.replaceAll(AND_HASH, "&")
.replaceAll(COLON_HASH, ":");
}
}
<小时/>

或者应该更像是:???

  1. 检查输入是否为 URL

  2. 创建网址

  3. 获取路径

  4. 分割为/

  5. 修复每个部分
  6. 将其放回原处
  7. 与查询相同,但稍微复杂一点
    ??
    我也想过,但它看起来比上面的那些替换更困惑:/

最佳答案

如果您能够清楚地识别出某个字符串是一个 URL,那么请关注用户的 @jschnasse answer在类似的问题中,这可能是您需要的解决方案:

URL url= new URL("http://some.url/xxx/a/%e4t%fcr%E4/b/%e4t%fcr%E4");
URI uri = new URI(url.getProtocol(), url.getUserInfo(), IDN.toASCII(url.getHost()), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
String correctEncodedURL=uri.toASCIIString();
System.out.println(correctEncodedURL);

输出:http://some.url/xxx/a/%25e4t%25fcr%25E4/b/%25e4t%25fcr%25E4

关于java - ISO-8858-1 到 UTF-8 仅在 URL 中,仅无效字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60618495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com