Tomcat 8+ comes bundled with a filter to set the character encoding.
This is described in Tomcat 8 Container Provided Filters.
This filter needs to be configured in your web.xml file plus a few other changes as below.
The following configuration works for
- Tomcat 8.0.30
- jdk1.8.0_66
- SQL Server 2008 R2
- Microsoft JDBC driver (sqljdbc42.jar)
Character Encoding Filter
web.xml
<filter>
<filter-name>setCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>setCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
JSP Page Encoding
web.xml
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
JSP Page Creation
Only standard English characters should be used
ie no accented characters etc
Database Character Types
All character types for table columns should be Unicode types eg NCHAR, NVARCHAR & NTEXT.
Database Connection String
For a SQL Server 2008 R2 database with collation 'Latin1_General_CI_AS', it seems that the connection string does not need to be set to use UTF-8.
context.xml
<Resource name="jdbc/gtraxDS" auth="Container"
type="javax.sql.DataSource"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://ctceu-wgc-dv026:45666; databaseName=gtraxd2"
username="myAppUsername"
password="myAppPa55word"/>
Strict Servlet compliance
Do not set 'strict servlet compliance'.
From the Tomcat 8 Migration Guide
The default value of URIEncoding attribute for HTTP and AJP connectors has been changed from
"ISO-8859-1" to be "UTF-8" (if "strict servlet compliance" mode is off, which is the default)
File System Character Encoding
Iterating & displaying contents of:
System.getProperties();
gives:
...
file.encoding Cp1252
file.encoding.pkg sun.io
...
It seems that the file encoding does not need to be changed