Похоже на нестандартную кодировку на основе UTF-16 для "滚动轴承", что в переводе с китайского означает "шарикоподшипники".
Я бы предложил просто .replaceAll
%u
путем обратной косой черты, а затем использовать StringEscapeUtils
от Apache Commons:
import org.apache.commons.lang3.StringEscapeUtils
val unescapedJava = StringEscapeUtils.unescapeJava(str.replaceAll("%u", "\\u"))
URLDecoder.decode(unescapedJava, StandardCharsets.UTF_8.name())
Это должно обрабатывать оба вида побега:
- Обычные escape-последовательности с
%
, за которыми следуют цифры, не затрагиваются заменой и unescapeJava
- Странные
%u
обрабатываются специально (заменены \u
) и устраняются на первом этапе.
Если (только если) вы абсолютно уверены, что все кодовые точки были закодированы таким образом, то вы можете обойтись без StringEscapeUtils
:
new String(
"%u6EDA%u52A8%u8F74%u627F"
.replaceAll("%u", "")
.grouped(4)
.map(Integer.parseInt(_, 16).toChar)
.toArray
)
, который производит
res: String = 滚动轴承
но я бы советовал против этого, потому что этот метод сломается для
вводы типа "%u6EDA%u52A8%u8F74%u627Fcafebabe"
, которые содержат символы без экранирования
Лучше использовать надежный библиотечный метод, который обрабатывает все угловые случаи.