A. jdk 中是否有任何嵌入式方法,或者我应-6ren">
gpt4 book ai didi

java - 将 "php unicode"转换为字符

转载 作者:行者123 更新时间:2023-11-29 06:18:02 25 4
gpt4 key购买 nike

如何通过 Java 将所谓的“php unicode”( link to php unicode ) 转换为普通字符?示例\xEF\xBC\xA1 -> A. jdk 中是否有任何嵌入式方法,或者我应该使用正则表达式进行此转换吗?

最佳答案

您首先需要将字节从字符串中提取到字节数组中而不更改它们,然后将字节数组解码为 UTF-8 字符串。

将字符串放入字节数组的最简单方法是使用 ISO-8859-1 对其进行编码,它将每个 unicode 值小于 256 的字符映射到具有相同值(或等效的负数)的字节

String phpUnicode = "\u00EF\u00BC\u00A1"
byte[] bytes = phpUnicode.getBytes("ISO-8859-1"); // maps to bytes with the same ordinal value
String javaString = new String(bytes, "UTF-8");
System.out.println(javaString);

编辑
以上将 UTF-8 转换为 Unicode 字符。如果您随后想将其转换为合理的 ASCII 等价物,没有标准的方法可以做到:但是 see this question

编辑
我假设您有一个包含与 UTF-8 序列具有相同序数值的字符的字符串,但您指出您的字符串字面上包含转义序列,如:

String phpUnicode = "\\xEF\\xBC\\xA1";

JDK 没有任何内置方法来像这样转换字符串,因此您需要使用自己的正则表达式。由于我们最终想将 utf-8 字节序列转换为字符串,因此我们需要使用 maybe 设置字节数组:

Pattern oneChar = Pattern.compile("\\\\x([0-9A-F]{2})|(.)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher matcher = oneChar.matcher(phpUnicode);
ByteArrayOutputStream bytes = new ByteArrayOutputStream();

while (matcher.find()) {
int ch;
if (matcher.group(1) == null) {
ch = matcher.group(2).charAt(0);
}
else {
ch = Integer.parseInt(matcher.group(1), 16);
}
bytes.write((int) ch);
}
String javaString = new String(bytes.toByteArray(), "UTF-8");
System.out.println(javaString);

这将通过转换\xAB 序列生成 UTF-8 流。然后将此 UTF-8 流转换为 Java 字符串。请务必注意,任何不属于转义序列的字符都将转换为相当于 unicode 字符低 8 位的字节。这适用于 ascii,但可能会导致非 ascii 字符的转码问题。

@麦克道尔:
顺序:

String phpUnicode = "\u00EF\u00BC\u00A1"
byte[] bytes = phpUnicode.getBytes("ISO-8859-1");

创建一个字节数组,其中包含的字节数与原始字符串的字符数相同,并且对于 unicode 值低于 256 的每个字符,相同的数值存储在字节数组中。

字符 FULLWIDTH LATIN CAPITAL LETTER A (U+FF41) 不存在于原始字符串中,因此它不在 ISO-8859-1 中是无关紧要的。

我知道将字符转换为字节时可能会出现转码错误,这就是为什么我说 ISO-8859-1 只会“将每个 unicode 值小于 256 的字符映射到具有相同值的字节”

关于java - 将 "php unicode"转换为字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4261881/

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