Java Заменить символы UTF-8

Мне нужно написать функцию для перевода некоторых «специальных символов» в «неспециальные символы». Моя отправляющая система поддерживает всю кодировку UTF-8, но в моей целевой системе доступен только сокращенный поднабор. Поэтому у меня есть таблица сопоставления для перевода этих символов. Эта таблица сопоставления представляет собой простой текстовый файл, содержащий, например, такую ​​запись:

D̂;D

Первый символ — это мой «специальный символ», который следует заменить символом после точки с запятой.

Я прочитал эту таблицу сопоставления в HashMap:

    String line;
        while((line = bufferedReader.readLine()) != null) {

            characterMap.put(
                    line.substring(0, line.indexOf(";")),
                    line.substring(line.indexOf(";") + 1)
            );
            
        }
        bufferedReader.close();

Это работает нормально. Затем я пытаюсь заменить символы:

        String target = "";
        for (Map.Entry<String, String> entry : characterMap.entrySet()) {
            target = source.replace(entry.getKey(), entry.getValue());
        }

Но эта замена не работает. target содержит то же, что и source

Как я могу сделать такую ​​функцию?

Вы пробовали пройти через свой код? Вы смотрели, что второй запуск вашего цикла дает результат первого?

Sören 19.04.2024 14:10

при запуске замены вы фактически не обновляетесь source. Однако вы заменяете target. Таким образом, результатом цикла for будет то, что целью будет source с последней выполненной заменой. Вместо этого вы можете назначить String target = source и для каждой итерации выполнить target = target.replace(...)

ODDminus1 19.04.2024 14:11

Замените ; на =. Затем вы можете загрузить карту за один раз с помощью Properties::load

g00se 19.04.2024 14:23

Я сравниваю источник и цель. Конечно я ожидал результата в цель.

Daniel Pomrehn 19.04.2024 14:27

И я шагнул через петлю. Карта обрабатывается правильно. Ключ и значение содержат правильную строку, которую следует заменить в источнике (и сохранить в цели).

Daniel Pomrehn 19.04.2024 14:27

Суть заключалась в том, что на каждой итерации вы начинаете с нового исходного кода, отбрасывая замены, выполненные на предыдущей итерации.

ODDminus1 19.04.2024 14:40

Ради интереса, является ли настоящим одиноким персонажем?

g00se 19.04.2024 15:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам следует продолжать обновлять результат (цель)

  String target = source;
  for (Map.Entry<String, String> entry : characterMap.entrySet()) {
      target = target.replace(entry.getKey(), entry.getValue());
  }

Большое спасибо! И извините за глупость... Конечно, цикл перезаписывает результаты на каждом этапе.

Daniel Pomrehn 19.04.2024 14:40

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