Download FAQ History |  | API Search Feedback

> ## Character Sets and Encodings

> ### Character Sets

> A character set is a set of textual and graphic symbols, each of which is mapped to a set of nonnegative integers.

> The first character set used in computing was ASCII. It is limited in that it can only represent American English. ASCII contains upper- and lower-case Latin alphabets, numerals, punctuation, a set of control codes, and a few miscellaneous symbols.

> Unicode defines a standardized, universal character set that can be extended to accommodate additions. Unicode characters may be represented as escape sequences, using the notation `\u` `XXXX`, where `XXXX` is the character's 16-bit representation in hexadecimal when the Java program source file encoding doesn't support Unicode. For example, the Spanish version of the Duke's Bookstore message file uses Unicode for non-ASCII characters:

>     {"TitleCashier", "Cajero"},
>     {"TitleBookDescription", "Descripci" + "\u00f3" + "n del
>     Libro"},
>     {"Visitor", "Es visitanten" + "\u00fa" + "mero "},
>     {"What", "Qu" + "\u00e9" + " libros leemos"},
>     {"Talk", " describe como componentes de software de web pueden
>     transformar la manera en que desrrollamos aplicaciones para el
>     web. Este libro es obligatorio para cualquier programador de
>     respeto!"},
>     {"Start", "Empezar a Comprar"},

> ### Character Encoding

> A character encoding maps a character set to units of a specific width, and defines byte serialization and ordering rules. Many character sets have more than one encoding. For example, Java programs can represent Japanese character sets using the EUC-JP or Shift-JIS encodings, among others. Each encoding has rules for representing and serializing a character set.

> The ISO 8859 series defines thirteen character encodings that can represent texts in dozens of languages. Each ISO 8859 character encoding may have up to 256 characters. ISO 8859-1 (Latin-1) comprises the ASCII character set, characters with diacritics (accents, diaereses, cedillas, circumflexes, and so on), and additional symbols.

> UTF-8 (Unicode Transformation Format, 8 bit form) is a variable-width character encoding that encodes 16-bit Unicode characters as one to four bytes. A byte in UTF-8 is equivalent to 7-bit ASCII if its high-order bit is zero; otherwise, the character comprises a variable number of bytes.

> UTF-8 is compatible with the majority of existing Web content and provides access to the Unicode character set. Current versions of browsers and email clients support UTF-8. In addition, many new Web standards specify UTF-8 as their character encoding. For example, UTF-8 is one of the two required encodings for XML documents (the other is UTF-16).

> See Appendix F for more information on character encodings in the Java 2 platform.

> Web components usually use `PrintWriter` to produce responses, which automatically encodes using ISO 8859-1. Servlets may also output binary data with `OutputStream` classes, which perform no encoding. An application that uses a character set that cannot use the default encoding must explicitly set a different encoding.

> For Web components, three encodings must be considered:

> - Request
> - Page (JSP pages)
> - Response

> #### Request Encoding

> The request encoding is the character encoding in which parameters in an incoming request are interpreted. Currently, many browsers do not send a request encoding qualifier with the `Content-Type` header. In such cases, a Web container will use the default encoding--ISO-8859-1--to parse request data.

> If the client hasn't set character encoding and the request data is encoded with a different encoding than the default, the data won't be interpreted correctly. To remedy this situation, you can use the `ServletRequest.setCharacterEncoding(String enc)` method to override the character encoding supplied by the container. This method must be called prior to reading request parameters or reading input using `getReader`. To control the request encoding from JSP pages, you can use the JSTL `fmt:requestEncoding` tag.

> This method must be called prior to parsing any request parameters or reading any input from the request. Calling this method once data has been read will not affect the encoding.

> #### Page Encoding

> For JSP pages, the page encoding is the character encoding in which the file is encoded. The page encoding is determined from the following sources:

> - The Page Encoding value of a JSP property group (see Setting Properties for Groups of JSP Pages) whose URL pattern matches the page.
> - The `pageEncoding` attribute of the `page` directive of the page. It is a translation-time error to name different encodings in the `pageEncoding` attribute of the page directive of a JSP page and in a JSP property group.
> - The `CHARSET` value of the `contentType` attribute of the `page` directive.

> If none of the above is provided, ISO-8859-1 is used as the default page encoding.

> The `pageEncoding` and `contentType` attributes determine the page character encoding of only the file that physically contains the `page` directive. A Web container raises a translation-time error if an unsupported page encoding is specified.

> #### Response Encoding

> The response encoding is the character encoding of the textual response generated from a Web component. The response encoding must be set appropriately so that the characters are rendered correctly for a given locale. A Web container sets an initial response encoding for a JSP page from the following sources:

> - The `CHARSET` value of the `contentType` attribute of the `page` directive.
> - The encoding specified by the `pageEncoding` attribute of the `page` directive
> - The Page Encoding value of a JSP property group whose URL pattern matches the page.

> If none of the above is provided, ISO-8859-1 is used as the default response encoding.

> The `setCharacterEncoding`, `setContentType`, and `setLocale` methods can be called repeatedly to change the character encoding. Calls made after the servlet response's `getWriter` method has been called or after the response is committed have no effect on the character encoding. Data is sent to the response stream on buffer flushes for buffered pages, or on encountering the first content on unbuffered pages. Calls to `setContentType` set the character encoding only if the given content type string provides a value for the charset attribute. Calls to `setLocale` set the character encoding only if neither `setCharacterEncoding` nor `setContentType` has set the character encoding before.To control the response encoding from JSP pages, you can use the JSTL `fmt.setLocale` tag.

> The first application in Chapter 16 allows a user to choose an English string representation of a locale from all the locales available to the Java 2 platform and then outputs a date localized for that locale. To ensure that the characters in the date can be rendered correctly for a wide variety of character sets, the JSP page that generates the date sets the response encoding to UTF-8 with the following directive:

>     <%@ page contentType="text/html; charset=UTF-8" %>

Download FAQ History |  | API Search Feedback

All of the material in The Java(TM) Web Services Tutorial is copyright-protected and may not be published in other works without express written permission from Sun Microsystems.