Encode based on response character encoding

Before this commit, characters were always encoded with the default
encoding (i.e. ISO-8859-1). Now, the character encoding of the response
is used.

Closes gh-files
This commit is contained in:
Arjen Poutsma
2024-06-19 11:14:27 +02:00
parent c72e31bcf5
commit e62255512a
2 changed files with 25 additions and 4 deletions

View File

@@ -92,7 +92,8 @@ public abstract class AbstractFormTag extends HtmlEscapingAwareTag {
* as required. This version is <strong>not</strong> {@link PropertyEditor}-aware.
*/
protected String getDisplayString(@Nullable Object value) {
return ValueFormatter.getDisplayString(value, isHtmlEscape());
String displayString = ValueFormatter.getDisplayString(value, false);
return isHtmlEscape() ? htmlEscape(displayString) : displayString;
}
/**
@@ -102,7 +103,8 @@ public abstract class AbstractFormTag extends HtmlEscapingAwareTag {
* to obtain the display value.
*/
protected String getDisplayString(@Nullable Object value, @Nullable PropertyEditor propertyEditor) {
return ValueFormatter.getDisplayString(value, propertyEditor, isHtmlEscape());
String displayString = ValueFormatter.getDisplayString(value, propertyEditor, false);
return isHtmlEscape() ? htmlEscape(displayString) : displayString;
}
/**

View File

@@ -96,8 +96,8 @@ class InputTagTests extends AbstractFormTagTests {
@Test
void simpleBindWithHtmlEscaping() throws Exception {
final String NAME = "Rob \"I Love Mangos\" Harrop";
final String HTML_ESCAPED_NAME = "Rob &quot;I Love Mangos&quot; Harrop";
final String NAME = "Rob \"I Love Cafés\" Harrop";
final String HTML_ESCAPED_NAME = "Rob &quot;I Love Caf&eacute;s&quot; Harrop";
this.tag.setPath("name");
this.rob.setName(NAME);
@@ -112,6 +112,25 @@ class InputTagTests extends AbstractFormTagTests {
assertValueAttribute(output, HTML_ESCAPED_NAME);
}
@Test
void simpleBindWithHtmlEscapingAndCharacterEncoding() throws Exception {
final String NAME = "Rob \"I Love Cafés\" Harrop";
final String HTML_ESCAPED_NAME = "Rob &quot;I Love Cafés&quot; Harrop";
this.getPageContext().getResponse().setCharacterEncoding("UTF-8");
this.tag.setPath("name");
this.rob.setName(NAME);
assertThat(this.tag.doStartTag()).isEqualTo(Tag.SKIP_BODY);
String output = getOutput();
assertTagOpened(output);
assertTagClosed(output);
assertContainsAttribute(output, "type", getType());
assertValueAttribute(output, HTML_ESCAPED_NAME);
}
protected void assertValueAttribute(String output, String expectedValue) {
assertContainsAttribute(output, "value", expectedValue);
}