Unicodeandcodepages

Unicode and codepage awareness

The many functions that deal with filenames in the sysutils routines have been changed from AnsiString to RawByteString so they do not perform implicit codepage conversions to the ANSI code page. At the same time, overloaded versions that accept a Unicode string have been created.

For routines that access actual OS functions using single-byte string APIS, the strings are converted to ensure that the OS routine receives a string with the correct encoding when using single-byte strings. This encoding is normally the DefaultFileSystemCodePage encoding.

On systems with a Unicode I/O API (2-byte strings), the native API is used, meaning that Unicode strings will be passed on as-is, but single-byte strings will be converted (implicitly) to Unicode.

The following is a minimal list of functions that have been changed and duplicated:

Name Description
FileCreate Create a new file and return a handle to it.
FileOpen Open an existing file and return a file handle
FileExists Check whether a particular file exists in the file system.
DirectoryExists Check whether a directory exists in the file system.
FileSetDate Set the date of a file.
FileGetAttr Return attributes of a file.
FileSetAttr Set the attributes of a file.
DeleteFile Delete a file from the file system.
RenameFile Rename a file.
FileSearch Search for a file in a path.
ExeSearch Search for an executable
FindFirst Start a file search and return a findhandle
FindNext Find the next entry in a findhandle.
FindClose Close a find handle
FileIsReadOnly Check whether a file is read-only.
GetCurrentDir Return the current working directory of the application.
SetCurrentDir Set the current directory of the application.

The following functions do not interact with the OS, but may nevertheless change the codepage of the strings involved in their operation:

Name Description
ChangeFileExt Change the extension of a filename.
ExtractFilePath Extract the path from a filename.
ExtractFileDrive Extract the drive part from a filename.
ExtractFileName Extract the filename part from a full path filename.
ExtractFileExt Return the extension from a filename.
ExtractFileDir Extract the drive and directory part of a filename.
ExtractShortPathName Returns a 8.3 path name
ExpandFileName Expand a relative filename to an absolute filename.
ExpandFileNameCase Expand a filename entered as case insensitive to the full path as stored on the disk.
ExtractRelativepath Extract a relative path from a filename, given a base directory.
ExpandUNCFileName Expand a relative filename to an absolute UNC filename.
IncludeTrailingPathDelimiter Add trailing directory separator to a pathname, if needed.
IncludeTrailingBackslash Add trailing directory separator to a pathname, if needed.
ExcludeTrailingBackslash Strip trailing directory separator from a pathname, if needed.
ExcludeTrailingPathDelimiter Strip trailing directory separator from a pathname, if needed.
IncludeLeadingPathDelimiter Prepend a path delimiter if there is not already one.
ExcludeLeadingPathDelimiter Strip the leading path delimiter of a path
IsPathDelimiter Is the character at the given position a pathdelimiter ?
DoDirSeparators Convert known directory separators to the current directory separator.
SetDirSeparators Set the directory separators to the known directory separators.
GetDirs Return a list of directory names from a path.
ConcatPaths Concatenate an array of paths to form a single path
GetEnvironmentVariable Return the value of an environment variable.