From cec1f4b31de7ec8c7f6ee5496d83ff3de091de59 Mon Sep 17 00:00:00 2001 From: LossyDragon Date: Tue, 20 Dec 2022 14:18:45 -0600 Subject: [PATCH] Support UTF-8 encoding --- .../steam/handlers/steamapps/PICSProductInfo.java | 11 +++++++++-- .../in/dragonbra/javasteam/types/KVTextReader.java | 10 ++++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/PICSProductInfo.java b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/PICSProductInfo.java index 22eca6e0..e9e9d55d 100644 --- a/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/PICSProductInfo.java +++ b/src/main/java/in/dragonbra/javasteam/steam/handlers/steamapps/PICSProductInfo.java @@ -10,6 +10,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.net.URI; +import java.nio.charset.Charset; /** * Represents the information for a single app or package @@ -40,8 +41,14 @@ public PICSProductInfo(CMsgClientPICSProductInfoResponse.Builder parentResponse, keyValues = new KeyValue(); if (appInfo.hasBuffer() && !appInfo.getBuffer().isEmpty()) { - // we don't want to read the trailing null byte - try (MemoryStream ms = new MemoryStream(appInfo.getBuffer().toByteArray(), 0, appInfo.getBuffer().size() - 1)) { + try { + // get the buffer as a string using the jvm's default charset. + // note: IDK why, but we have to encode this using the default charset + String bufferString = appInfo.getBuffer().toString(Charset.defaultCharset()); + // get the buffer as a byte array using utf-8 as a supported charset + byte[] byteBuffer = bufferString.getBytes("UTF-8"); + // we don't want to read the trailing null byte + MemoryStream ms = new MemoryStream(byteBuffer, 0, byteBuffer.length - 1); keyValues.readAsText(ms); } catch (IOException e) { throw new IllegalArgumentException("failed to read buffer", e); diff --git a/src/main/java/in/dragonbra/javasteam/types/KVTextReader.java b/src/main/java/in/dragonbra/javasteam/types/KVTextReader.java index baf2b246..b7049a56 100644 --- a/src/main/java/in/dragonbra/javasteam/types/KVTextReader.java +++ b/src/main/java/in/dragonbra/javasteam/types/KVTextReader.java @@ -3,6 +3,7 @@ import in.dragonbra.javasteam.util.Passable; import in.dragonbra.javasteam.util.Strings; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PushbackInputStream; @@ -139,7 +140,7 @@ public String readToken(Passable wasQuoted, Passable wasCondit // " read(); - StringBuilder sb = new StringBuilder(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); while (!endOfStream()) { if (peek() == '\\') { @@ -152,7 +153,7 @@ public String readToken(Passable wasQuoted, Passable wasCondit replacedChar = escapedChar; } - sb.append(replacedChar); + baos.write(replacedChar); continue; } @@ -161,13 +162,14 @@ public String readToken(Passable wasQuoted, Passable wasCondit break; } - sb.append((char) read()); + baos.write(read()); } // " read(); - return sb.toString(); + // convert the output stream as an utf-8 supported string. + return baos.toString("UTF-8"); } if (next == '{' || next == '}') {