diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt index 2db5a8947aa..4b95dd6c5a5 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt @@ -314,6 +314,9 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { } if (typeStr == "java.lang.String") { + text = text.replace("\\\\([0-3]?[0-7]{1,2})".toRegex(), { + String.format("\\u%04x", Integer.parseInt(it.groupValues[1], 8)) + }) text = text.replace("\\$([A-Za-z]+|\\{)".toRegex(), "\\\\$0") } } diff --git a/j2k/testData/fileOrElement/literalExpression/stringOctalChars.java b/j2k/testData/fileOrElement/literalExpression/stringOctalChars.java new file mode 100644 index 00000000000..48c23433472 --- /dev/null +++ b/j2k/testData/fileOrElement/literalExpression/stringOctalChars.java @@ -0,0 +1,7 @@ +public class A { + public String a = "\770123"; + public String b = "\1110123"; + public String c = "\3770123"; + public String d = "\000Text"; + public String f = "\09"; +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/literalExpression/stringOctalChars.kt b/j2k/testData/fileOrElement/literalExpression/stringOctalChars.kt new file mode 100644 index 00000000000..851ed3112b5 --- /dev/null +++ b/j2k/testData/fileOrElement/literalExpression/stringOctalChars.kt @@ -0,0 +1,7 @@ +class A { + var a = "\u003f0123" + var b = "\u00490123" + var c = "\u00ff0123" + var d = "\u0000Text" + var f = "\u00009" +} \ No newline at end of file diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java index 830da8ac157..7a03a2ec90a 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -3232,6 +3232,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("stringOctalChars.java") + public void testStringOctalChars() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/literalExpression/stringOctalChars.java"); + doTest(fileName); + } + @TestMetadata("trueOrFalse.java") public void testTrueOrFalse() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/literalExpression/trueOrFalse.java"); diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index 283d15efa01..f3f00ee821f 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -3232,6 +3232,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("stringOctalChars.java") + public void testStringOctalChars() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/literalExpression/stringOctalChars.java"); + doTest(fileName); + } + @TestMetadata("trueOrFalse.java") public void testTrueOrFalse() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/literalExpression/trueOrFalse.java");