
@c %start of fragment

@node Character Set Conversion
@chapter Character Set Conversion
convert strings between different character sets using .

@section Overview
@section File Name Encodings
Historically, Unix has not had a defined encoding for file names: a file name is
valid as long as it does not have path separators in it ("/"). However,
displaying file names may require conversion: from the character set in which
they were created, to the character set in which the application operates.
Consider the Spanish file name "@file{Presentación.sxi}". If the application
which created it uses ISO-8859-1 for its encoding, then the actual file name on
disk would look like this:

@example 

Character:  P  r  e  s  e  n  t  a  c  i  ó  n  .  s  x  i
Hex code:   50 72 65 73 65 6e 74 61 63 69 f3 6e 2e 73 78 69
      
@end example

However, if the application use UTF-8, the actual file name on disk would look
like this:

@example 

Character:  P  r  e  s  e  n  t  a  c  i  ó     n  .  s  x  i
Hex code:   50 72 65 73 65 6e 74 61 63 69 c3 b3 6e 2e 73 78 69
      
@end example

Glib uses UTF-8 for its strings, and GUI toolkits like GTK+ that use Glib do the
same thing. If you get a file name from the file system, for example, from
@code{readdir(3)} or from @code{@code{g-dir-read-name}}, and you wish to display
the file name to the user, you @emph{will} need to convert it into UTF-8. The
opposite case is when the user types the name of a file he wishes to save: the
toolkit will give you that string in UTF-8 encoding, and you will need to
convert it to the character set used for file names before you can create the
file with @code{open(2)} or @code{fopen(3)}.

By default, Glib assumes that file names on disk are in UTF-8 encoding. This is
a valid assumption for file systems which were created relatively recently: most
applications use UTF-8 encoding for their strings, and that is also what they
use for the file names they create. However, older file systems may still
contain file names created in "older" encodings, such as ISO-8859-1. In this
case, for compatibility reasons, you may want to instruct Glib to use that
particular encoding for file names rather than UTF-8. You can do this by
specifying the encoding for file names in the @env{G_FILENAME_ENCODING}
environment variable. For example, if your installation uses ISO-8859-1 for file
names, you can put this in your @file{~/.profile}:

@example 

export G_FILENAME_ENCODING=ISO-8859-1
      
@end example

Glib provides the functions @code{@code{g-filename-to-utf8}} and
@code{@code{g-filename-from-utf8}} to perform the necessary conversions. These
functions convert file names from the encoding specified in
@env{G_FILENAME_ENCODING} to UTF-8 and vice-versa. @emph{(the missing figure,
file-name-encodings-diagram} illustrates how these functions are used to convert
between UTF-8 and the encoding for file names in the file system.

@subsection Checklist for Application Writers
This section is a practical summary of the detailed description above. You can
use this as a checklist of things to do to make sure your applications process
file name encodings correctly.

@enumerate 
@item
@item
@item
@end enumerate

If you get a file name from the file system from a function such as
@code{readdir(3)} or @code{@code{gtk-file-chooser-get-filename}}, you do not
need to do any conversion to pass that file name to functions like
@code{open(2)}, @code{rename(2)}, or @code{fopen(3)} &#x2014; those are "raw"
file names which the file system understands.

If you need to display a file name, convert it to UTF-8 first by using
@code{@code{g-filename-to-utf8}}. If conversion fails, display a string like
"@samp{Unknown file name}". @emph{Do not} convert this string back into the
encoding used for file names if you wish to pass it to the file system; use the
original file name instead. For example, the document window of a word processor
could display "Unknown file name" in its title bar but still let the user save
the file, as it would keep the raw file name internally. This can happen if the
user has not set the @env{G_FILENAME_ENCODING} environment variable even though
he has files whose names are not encoded in UTF-8.

If your user interface lets the user type a file name for saving or renaming,
convert it to the encoding used for file names in the file system by using
@code{@code{g-filename-from-utf8}}. Pass the converted file name to functions
like @code{fopen(3)}. If conversion fails, ask the user to enter a different
file name. This can happen if the user types Japanese characters when
@env{G_FILENAME_ENCODING} is set to @samp{ISO-8859-1}, for example.

@section Usage
@include defuns-conversions.xml.texi

@c %end of fragment
