244 lines · 9.5 KB · TeX
RawDownload
\declaremodule{standard}{email.charset}\modulesynopsis{Character Sets} This module provides a class \class{Charset} for representingcharacter sets and character set conversions in email messages, aswell as a character set registry and several convenience methods formanipulating this registry.  Instances of \class{Charset} are used inseveral other modules within the \module{email} package. Import this class from the \module{email.charset} module. \versionadded{2.2.2} \begin{classdesc}{Charset}{\optional{input_charset}}Map character sets to their email properties. This class provides information about the requirements imposed onemail for a specific character set.  It also provides convenienceroutines for converting between character sets, given the availabilityof the applicable codecs.  Given a character set, it will do its bestto provide information on how to use that character set in an emailmessage in an RFC-compliant way. Certain character sets must be encoded with quoted-printable or base64when used in email headers or bodies.  Certain character sets must beconverted outright, and are not allowed in email. Optional \var{input_charset} is as described below; it is alwayscoerced to lower case.  After being alias normalized it is also usedas a lookup into the registry of character sets to find out the headerencoding, body encoding, and output conversion codec to be used forthe character set.  For example, if\var{input_charset} is \code{iso-8859-1}, then headers and bodies willbe encoded using quoted-printable and no output conversion codec isnecessary.  If \var{input_charset} is \code{euc-jp}, then headers willbe encoded with base64, bodies will not be encoded, but output textwill be converted from the \code{euc-jp} character set to the\code{iso-2022-jp} character set.\end{classdesc} \class{Charset} instances have the following data attributes: \begin{datadesc}{input_charset}The initial character set specified.  Common aliases are converted totheir \emph{official} email names (e.g. \code{latin_1} is converted to\code{iso-8859-1}).  Defaults to 7-bit \code{us-ascii}.\end{datadesc} \begin{datadesc}{header_encoding}If the character set must be encoded before it can be used in anemail header, this attribute will be set to \code{Charset.QP} (forquoted-printable), \code{Charset.BASE64} (for base64 encoding), or\code{Charset.SHORTEST} for the shortest of QP or BASE64 encoding.Otherwise, it will be \code{None}.\end{datadesc} \begin{datadesc}{body_encoding}Same as \var{header_encoding}, but describes the encoding for themail message's body, which indeed may be different than the headerencoding.  \code{Charset.SHORTEST} is not allowed for\var{body_encoding}.\end{datadesc} \begin{datadesc}{output_charset}Some character sets must be converted before they can be used inemail headers or bodies.  If the \var{input_charset} is one ofthem, this attribute will contain the name of the character setoutput will be converted to.  Otherwise, it will be \code{None}.\end{datadesc} \begin{datadesc}{input_codec}The name of the Python codec used to convert the \var{input_charset} toUnicode.  If no conversion codec is necessary, this attribute will be\code{None}.\end{datadesc} \begin{datadesc}{output_codec}The name of the Python codec used to convert Unicode to the\var{output_charset}.  If no conversion codec is necessary, thisattribute will have the same value as the \var{input_codec}.\end{datadesc} \class{Charset} instances also have the following methods: \begin{methoddesc}[Charset]{get_body_encoding}{}Return the content transfer encoding used for body encoding. This is either the string \samp{quoted-printable} or \samp{base64}depending on the encoding used, or it is a function, in which case youshould call the function with a single argument, the Message objectbeing encoded.  The function should then set the\mailheader{Content-Transfer-Encoding} header itself to whatever isappropriate. Returns the string \samp{quoted-printable} if\var{body_encoding} is \code{QP}, returns the string\samp{base64} if \var{body_encoding} is \code{BASE64}, and returns thestring \samp{7bit} otherwise.\end{methoddesc} \begin{methoddesc}{convert}{s}Convert the string \var{s} from the \var{input_codec} to the\var{output_codec}.\end{methoddesc} \begin{methoddesc}{to_splittable}{s}Convert a possibly multibyte string to a safely splittable format.\var{s} is the string to split. Uses the \var{input_codec} to try and convert the string to Unicode,so it can be safely split on character boundaries (even for multibytecharacters). Returns the string as-is if it isn't known how to convert \var{s} toUnicode with the \var{input_charset}. Characters that could not be converted to Unicode will be replacedwith the Unicode replacement character \character{U+FFFD}.\end{methoddesc} \begin{methoddesc}{from_splittable}{ustr\optional{, to_output}}Convert a splittable string back into an encoded string.  \var{ustr}is a Unicode string to ``unsplit''. This method uses the proper codec to try and convert the string fromUnicode back into an encoded format.  Return the string as-is if it isnot Unicode, or if it could not be converted from Unicode. Characters that could not be converted from Unicode will be replacedwith an appropriate character (usually \character{?}). If \var{to_output} is \code{True} (the default), uses\var{output_codec} to convert to an encoded format.  If \var{to_output} is \code{False}, it uses\var{input_codec}.\end{methoddesc} \begin{methoddesc}{get_output_charset}{}Return the output character set. This is the \var{output_charset} attribute if that is not \code{None},otherwise it is \var{input_charset}.\end{methoddesc} \begin{methoddesc}{encoded_header_len}{}Return the length of the encoded header string, properly calculatingfor quoted-printable or base64 encoding.\end{methoddesc} \begin{methoddesc}{header_encode}{s\optional{, convert}}Header-encode the string \var{s}. If \var{convert} is \code{True}, the string will be converted from theinput charset to the output charset automatically.  This is not usefulfor multibyte character sets, which have line length issues (multibytecharacters must be split on a character, not a byte boundary); use thehigher-level \class{Header} class to deal with these issues (see\refmodule{email.header}).  \var{convert} defaults to \code{False}. The type of encoding (base64 or quoted-printable) will be based onthe \var{header_encoding} attribute.\end{methoddesc} \begin{methoddesc}{body_encode}{s\optional{, convert}}Body-encode the string \var{s}. If \var{convert} is \code{True} (the default), the string will beconverted from the input charset to output charset automatically.Unlike \method{header_encode()}, there are no issues with byteboundaries and multibyte charsets in email bodies, so this is usuallypretty safe. The type of encoding (base64 or quoted-printable) will be based onthe \var{body_encoding} attribute.\end{methoddesc} The \class{Charset} class also provides a number of methods to supportstandard operations and built-in functions. \begin{methoddesc}[Charset]{__str__}{}Returns \var{input_charset} as a string coerced to lower case.\method{__repr__()} is an alias for \method{__str__()}.\end{methoddesc} \begin{methoddesc}[Charset]{__eq__}{other}This method allows you to compare two \class{Charset} instances for equality.\end{methoddesc} \begin{methoddesc}[Header]{__ne__}{other}This method allows you to compare two \class{Charset} instances for inequality.\end{methoddesc} The \module{email.charset} module also provides the followingfunctions for adding new entries to the global character set, alias,and codec registries: \begin{funcdesc}{add_charset}{charset\optional{, header_enc\optional{,    body_enc\optional{, output_charset}}}}Add character properties to the global registry. \var{charset} is the input character set, and must be the canonicalname of a character set. Optional \var{header_enc} and \var{body_enc} is either\code{Charset.QP} for quoted-printable, \code{Charset.BASE64} forbase64 encoding, \code{Charset.SHORTEST} for the shortest ofquoted-printable or base64 encoding, or \code{None} for no encoding.\code{SHORTEST} is only valid for \var{header_enc}. The default is\code{None} for no encoding. Optional \var{output_charset} is the character set that the outputshould be in.  Conversions will proceed from input charset, toUnicode, to the output charset when the method\method{Charset.convert()} is called.  The default is to output in thesame character set as the input. Both \var{input_charset} and \var{output_charset} must have Unicodecodec entries in the module's character set-to-codec mapping; use\function{add_codec()} to add codecs the module doesnot know about.  See the \refmodule{codecs} module's documentation formore information. The global character set registry is kept in the module globaldictionary \code{CHARSETS}.\end{funcdesc} \begin{funcdesc}{add_alias}{alias, canonical}Add a character set alias.  \var{alias} is the alias name,e.g. \code{latin-1}.  \var{canonical} is the character set's canonicalname, e.g. \code{iso-8859-1}. The global charset alias registry is kept in the module globaldictionary \code{ALIASES}.\end{funcdesc} \begin{funcdesc}{add_codec}{charset, codecname}Add a codec that map characters in the given character set to and fromUnicode. \var{charset} is the canonical name of a character set.\var{codecname} is the name of a Python codec, as appropriate for thesecond argument to the \function{unicode()} built-in, or to the\method{encode()} method of a Unicode string.\end{funcdesc}