несовпадение результатов кодирования символов Groovy для неподдерживаемых символов

Это пока мой анализ и препятствие, предположим для приведенного ниже символа, который в основном поддерживается набором символов «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.

N.B., я получил данные непосредственно из 2 разных текстовых файлов, закодированных в 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,

println(new File('/var/www/html/euc_jp.txt').getText('EUC-JP').getBytes("EUC-JP"))
println(new File('/var/www/html/utf_8.txt').getText('UTF-8').getBytes("UTF-8"))

На данный момент это мое препятствие, во-первых, байтовое представление для этих двух языков отличается, если это не ограничение Groovy, а Java8, как я могу создать такую ​​же байтовую компоновку, которая создается php, во-вторых, что такое эквивалентный код для нативной функции php, b_convert_encoding (). Итак, я смог преобразовать любую строковую кодировку, где мог бы быть какой-нибудь символ, который не поддерживается обоими механизмами кодирования.

-1

Решение

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

E2 80 8D это UTF-8 для Символ Unicode ‘ZIRO WIDTH JOINER’ (U + 200D).

E2 80 95 это UTF-8 для Unicode персонаж ‘ГОРИЗОНТАЛЬНЫЙ БАР’ (U + 2015).

Если вы хотите напечатать значения байтового массива в виде читаемого текста, я предлагаю вам распечатать байты, используя 2-значный HEX. Таким образом, каждый байт имеет длину 2 шестнадцатеричных числа.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]