Java Groovy字符编码结果与不支持的字符不匹配

Java Groovy字符编码结果与不支持的字符不匹配,java,php,groovy,utf-8,character-encoding,Java,Php,Groovy,Utf 8,Character Encoding,这是到目前为止我的分析和障碍,假设下面的字符基本上由“UTF-8”字符集支持,但不支持“EUC-JP”。 “―” 对于php,有一个方法“var_dump(input_string)”将任何字符串转换为编码为“EUC-JP”的字节数组,在本例中,它返回 [161, 189, 10] //Note: [3]=>int(10) for Line Feed. 类似地,当我生成编码为“UTF-8”的字节数组时,在本例中它返回 [226, 128, 141,10] //Note: [4]=>

这是到目前为止我的分析和障碍,假设下面的字符基本上由“UTF-8”字符集支持,但不支持“EUC-JP”。 “―” 对于php,有一个方法“var_dump(input_string)”将任何字符串转换为编码为“EUC-JP”的字节数组,在本例中,它返回

[161, 189, 10] //Note: [3]=>int(10) for Line Feed.
类似地,当我生成编码为“UTF-8”的字节数组时,在本例中它返回

[226, 128, 141,10] //Note: [4]=>int(10) for Line Feed.
但是,当我在Groovy中尝试同样的东西时, 它的行为完全不同,对于EUC-JP,字节排列如下:

[-95, -67, 10] //Note: [3]=>int(10) for Line Feed.
对于UTF-8

[-30, -128, -107, 10] //Note: [4]=>int(10) for Line Feed.
注意,我直接从两个分别用EUC-JP和UTF-8编码的不同文本文件中获取数据。以上所有数组的最后一个字节用于LF(换行符)。由于这两种语言的相同字符编码的字节排列不同,因此不可能在两者之间匹配生成的哈希

这是到目前为止的代码示例,从php开始

<?php
$myfile = fopen("euc_jp.txt", "r") or die("Unable to open file!");
$str1 = fread($myfile,filesize("euc_jp.txt"));

echo "Read From File EUC-JP:<br/>";
echo $str1;
$byte_array1 = unpack('C*', $str1);
echo "<br/>Byte Dump of EUC-JP File Content:<br/>";
var_dump($byte_array1);

echo "<br/><br/>";
$myfile2 = fopen("utf_8.txt", "r") or die("Unable to open file!");
$str2 = fread($myfile2,filesize("utf_8.txt"));

echo "<br/><br/>";
echo "Read From File UTF-8:<br/>";
echo $str2;
$byte_array2 = unpack('C*', $str2);
echo "<br/>Byte Dump of EUC-JP File Content:<br/>";
var_dump($byte_array2);


$encodedToEucJp = mb_convert_encoding($str2, "EUC_JP");
echo "<br/><br/>After conversion (UTF-8) to (EUC-JP): <br/>";
echo $encodedToEucJp;

echo "<br/><br/>";

echo "Hash Generation Directly From EUC-JP:<br/>";
print_r(md5($str1));

echo "<br/><br/>";
echo "Hash Generation From UTF-8 File Content After Encoded to EUC-JP:<br/>";
print_r(md5($encodedToEucJp));

fclose($myfile);
fclose($myfile2);
?>
到目前为止,这是我的障碍,首先,这两种语言的字节表示是不同的,如果这不是Groovy和Java8的限制,那么如何生成与php相同的字节排列,其次,本机php函数b_convert_encoding()的等效代码是什么。因此,我能够转换任何字符串编码,其中可能有一些编码机制都不支持的字符。

Java和Groovy字节是有符号的值,即一个字节的值介于
-128
+127
之间

要为同一个字节计算相应的无符号值,请将
256
添加到负值,例如
-95+256=161

因此,您看到的是相同的字节。只是PHP将值打印为无符号,Groovy将值打印为有符号。它们仍然是一个字节中相同的8位

Unsigned             Signed                 Hex
161, 189, 10      == -95, -67, 10        == A1, BD, 0A
226, 128, 141, 10 == -30, -128, -115, 10 == E2, 80, 8D, 0A
226, 128, 149, 10 == -30, -128, -107, 10 == E2, 80, 95, 0A
e280 8D
是UTF-8的标准配置

E2 80 95
是UTF-8


如果要将字节数组的值打印为可读文本,建议使用2位十六进制打印字节。这样,每个字节的长度始终为2个十六进制数字。

谢谢,您的回答对我帮助很大。在这方面我有另一个上下文,基本上我试图编码一个包含字符“―”的字符串,使用php它平滑地编码到EUC-JP并以字节返回[161189],但是,当我尝试用java编码相同的字符和相同的编码时,它只返回字节中的“?”,这是[63],我的期望是[161189]。所以,我需要做些什么来解决这个问题。@Md.HasanBasriAngel,这是因为“―”()在中不存在。“-”()会,如bytes
a1bd
@Md.HasanBasriAngel再次检查。Unicode字符U+2015不在该列表中,这是您在上面评论中发布的字符(如果您不相信,请复制/粘贴)。Unicode字符U+2014在EUC-JP字符列表中,但这是一个不同的字符,尽管它们看起来非常相似。再读一遍我的书!!再次感谢您,抱歉之前的消息,请忽略此消息。但我的问题是,在php中,他们通过这个转换函数mb_convert_encoding($str2,“EUC_JP”)以某种方式管理它。我基本上在groovy和java中寻找类似的机制。@Md.HasanBasriAngel java遵循规范。PHP轻视规范和规范。不要指望其他语言会这样做。如果希望所有“看起来相似”的字符映射到同一个EUC_JP字符,则需要找到“看起来相似”的定义(如果存在这样的定义)。
Unsigned             Signed                 Hex
161, 189, 10      == -95, -67, 10        == A1, BD, 0A
226, 128, 141, 10 == -30, -128, -115, 10 == E2, 80, 8D, 0A
226, 128, 149, 10 == -30, -128, -107, 10 == E2, 80, 95, 0A