Skip to content

Commit be695f5

Browse files
committed
RubyTranslator: update bytesToStr so it always returns string encoded in UTF-8; fixes ExprStrEncodings and ValidEqStrEncodings tests
1 parent 98ee4d9 commit be695f5

1 file changed

Lines changed: 20 additions & 2 deletions

File tree

shared/src/main/scala/io/kaitai/struct/translators/RubyTranslator.scala

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,26 @@ class RubyTranslator(provider: TypeProvider) extends BaseTranslator(provider)
8787
override def intToStr(i: Ast.expr, base: Ast.expr): String =
8888
translate(i) + s".to_s(${translate(base)})"
8989

90-
override def bytesToStr(bytesExpr: String, encoding: Ast.expr): String =
91-
s"($bytesExpr).force_encoding(${translate(encoding)})"
90+
override def bytesToStr(bytesExpr: String, encoding: Ast.expr): String = {
91+
// We can skip "encode to UTF8" if we're 100% sure that the string we're handling is already
92+
// in UTF8. To check that, we need to see if the encoding expression is constant, and if it is,
93+
// then check if
94+
val encodingOpt = encoding.evaluateStrConst
95+
val needEncode: Boolean = encodingOpt match {
96+
case Some(encodingConst) =>
97+
val encodingConstLower = encodingConst.toLowerCase
98+
encodingConstLower != "utf8" && encodingConstLower != "utf-8"
99+
case None =>
100+
true
101+
}
102+
103+
s"($bytesExpr).force_encoding(${translate(encoding)})" + (if (needEncode) {
104+
".encode('UTF-8')"
105+
} else {
106+
""
107+
})
108+
}
109+
92110
override def bytesLength(b: Ast.expr): String =
93111
s"${translate(b)}.size"
94112
/**

0 commit comments

Comments
 (0)