我正在使用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代码转换为小写字母?
答案 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();
}
}