Java для С# ISO8859-1 не соответствует

У меня есть код Java для кодирования/декодирования текста следующим образом:

public static String decode(String str, String str2) {
    String str3 = "";
    String decode = URLDecoder.decode(str, "UTF-8");
    char[] charArray = new String(Base64.decode(decode, 0), "ISO8859-1").toCharArray();
    char[] charArray2 = str2.toCharArray();
    for (int i = 0; i < charArray.length; i++) {
        str3 = str3 + ((char) (charArray[i] - charArray2[i % str2.length()]));
    }
    return str3;
}

Мне не удалось преобразовать этот фрагмент кода в С#. Следующий код генерирует неверный результат. Вот код С#

static string Base64Encode(string plainText)
{
    var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
    return System.Convert.ToBase64String(plainTextBytes);
}

static string Base64Decode(string base64EncodedData)
{
    var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
    return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}

static string ISO88591(string value)
{
    Encoding iso = Encoding.GetEncoding(1252);
    byte[] utfBytes = Encoding.UTF8.GetBytes(value);
    byte[] isoBytes = Encoding.Convert(Encoding.UTF8, iso, utfBytes);
    string msg = iso.GetString(isoBytes);
    return msg;
}

public static string decode(string str, string str2)
{
    string str3 = "";
    string decode = HttpUtility.UrlDecode(str, Encoding.UTF8);
    char[] charArray = ISO88591(Base64Decode(decode)).ToCharArray();
    char[] charArray2 = str2.ToCharArray();
    for (int i = 0; i < charArray.Length; i++)
    {
        str3 = str3 + ((char)(charArray[i] - charArray2[i % str2.Length]));
    }
    return str3;
}

Я застрял в течение нескольких часов, пытаясь решить эту проблему. Я понятия не имею, какая часть неверна. На самом деле он не выдает никаких ошибок, но, к сожалению, результат отличается от того, что выдает Java.

Я не пробовал, а не должно быть "ISO-8859-1"? с дефисами?

jason.kaisersmith 30.07.2023 19:03

Вы тестировали каждый шаг отдельно, сравнивая кодировку/декодирование base64 в С# и Java и т. д. Кстати, вам следует рассмотреть возможность использования StringBuilder (как в Java, так и в С#); выполнение конкатенации строк в цикле (на любом языке) не является хорошей идеей

Flydog57 30.07.2023 19:11

Ну похоже Encoding iso = Encoding.GetEncoding(1252); должно быть Encoding iso = Encoding.GetEncoding("ISO-8859-1");

Elliott Frisch 30.07.2023 19:57

Это может помочь узнать, какие строки вы используете. Следует сказать, что код UTF-8 не обязательно будет передавать туда и обратно 8-битную кодировку, такую ​​​​как ISO-8859-1.

g00se 30.07.2023 19:59

Здесь просто дикая догадка, но, возможно, это связано: разница в кодировке utf8 в node.js и .NET . Разница в том, что, как объяснил CodeconValley в этом ответе, .NET и Node.JS непоследовательно обрабатывают недопустимые или недекодируемые последовательности UTF-8. Поскольку ISO-8859-1 имеет гораздо более ограниченный набор символов, чем utf-8, возможно, вы сталкиваетесь с аналогичным несоответствием здесь с тем, как две платформы обрабатывают недекодируемые символы?

dbc 30.07.2023 21:50

Было бы полезно, если бы вы предоставили образец ввода/вывода. Не пройти необходимые этапы отладки — это одно, а полностью потребовать от нас изобретать тестовые случаи — это другое.

Maarten Bodewes - on strike 31.07.2023 08:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
public static string Decode(string str, string str2)
{
    string str3 = "";
    string decode = Uri.UnescapeDataString(str);
    char[] charArray = Encoding.GetEncoding("ISO-8859-1").GetString(Convert.FromBase64String(decode)).ToCharArray();
    char[] charArray2 = str2.ToCharArray();
    for (int i = 0; i < charArray.Length; i++)
    {
        str3 = str3 + ((char)(charArray[i] - charArray2[i % str2.Length]));
    }
    return str3;
}

от AICodeConvert

Приведенный выше код был сгенерирован с помощью AICodeConvert.com. Вы можете попробовать.

enqueue 31.07.2023 08:00

Если бы постер хотел, чтобы код, сгенерированный ИИ, не объяснял, почему он будет работать, я думаю, они бы попросили ИИ. Сгенерированные ИИ ответы считаются не по теме, а то, как вы сформулировали свой комментарий, делает его спамом.

Maarten Bodewes - on strike 31.07.2023 08:10

Другие вопросы по теме