Java URLEncoder保留原始消息的大小写,但使UTF-8代码小写

时间:2018-09-13 19:31:34

标签: java utf-8 url-encoding case-sensitive

我正在使用URLEncoder.encode(message,“ UTF-8”);编码字符串。

问题是我需要最终字符串中的UTF-8代码为小写,同时保持原始消息的大小写。

示例:

消息:{消息

所需的输出:%5bMessage

URLEncoder.encode(“ {Message”,“ UTF-8”); ->%5BMessage

URLEncoder.encode(message,“ UTF-8”)。toLowerCase(); ->%5bmessage

是否可以更改URLEncoder的行为?

有没有一种简便的方法可以将所有UTF-8字符和任意字符串长度的所有UTF-8代码转换为小写字母?

2 个答案:

答案 0 :(得分:0)

这已硬编码到URLEncoder中(我正在查看Oracle的JDK btw)。转换基本上是转换您的字符,并获取每个字符的十六进制值,然后减去<?php $conn = mysqli_connect("******", "******", "******", "******"); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT id, username, email FROM register"; $sessie_username = "SELECT username FROM sessie"; $result = $conn->query($sql); $result1 = $conn->query($sessie_username); // initialise the array $nameninsessie = array(); // loop over all logged in users while ( $row1 = $result1->fetch_assoc() ) { // add thir names to an array $nameninsessie[] = $row1["username"]; } if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { if (in_array($row["username"], $nameninsessie)) { $sql1 = "Ja"; } else { $sql1 = "Nee"; } echo "<tr><td>" . $row["id"]. "</td><td>" . $row["username"] . "</td> <td>". $row["email"]. "</td><td>" . $sql1 . "</td></tr>"; } echo "</table>"; } else { echo "0 resultaten"; } $conn->close(); ?> 之间的差(字符值的大写到小写),以强制使用大写值。

'a' -'A'

我认为您可以解决此问题的唯一方法是使用反射并将if (Character.isLetter(ch)) { ch -= caseDiff; } 修改为0,因为此变量是static final:

URLEncoder#caseDiff

做类似的事情(考虑一下此伪代码。您将需要第二遍):

static final int caseDiff = ('a' - 'A');

尽管如此,我实际上真的对您的意图感到好奇,我想知道这是否真的是您想要的。

答案 1 :(得分:0)

  

问题是我需要在最终字符串中使用UTF-8代码以使其小写,同时保持原始消息的大小写。

我认为您的意思是您希望URL中的十六进制数字转义为小写(不是“ UTF-8代码”)。无论如何,这是一个棘手的问题,因为URL编码的规范(也称为“百分比编码”)明确指定百分比代码中的十六进制数字不区分大小写。只有两个十六进制数字不同的两个百分比编码URL是等效的,因此只要使用它们,否则处理它们的代码很可能会成为一个持续的问题。

  

是否可以更改URLEncoder的行为?

The docs of java.net.URLEncoder很简短。不需要太多的检查就可以看到没有,没有机制可以调节其行为的这一方面。您可以编写自己的实现(并不难),或者可以找到第三方编码器,但是标准库的编码器将无法满足您的要求。

  

有没有一种简单的方法可以将所有UTF-8字符和任意字符串长度的所有UTF-8代码转换为小写字母?

这取决于您所说的“简单”。从原则上讲,可以进行这种转换,但是当您解析和更新编码的URL时,您花费的精力至少是在编码方式中执行编码所需的两倍。第一名。

但是,如果您确实想这样做,则可以使用如下所示的内容:

import java.util.regex.*;

public class URLRecoder {
    private final static Pattern CODE_PATTERN = Pattern.compile("%[0-9A-Fa-f]{2}");

    /**
     * Recodes a URL-encoded string to ensure that all hex digits in the
     * percent codes that are not decimal digits are expressed in lowercase.
     */
    public String recode(String urlString) {
        StringBuilder sb = new StringBuffer();
        Matcher m = CODER_PATTERN.matcher(urlString);

        while (m.find()) {
            m.appendReplacement(sb, m.group().toLowerCase());
        }
        m.appendTail(sb);

        return sb.toString();
    }
}