Функция RtlUnicodeToUTF8N (wdm.h)
Подпрограмма RtlUnicodeToUTF8N преобразует строку Юникода в строку UTF-8.
Синтаксис
NTSYSAPI NTSTATUS RtlUnicodeToUTF8N(
[out] PCHAR UTF8StringDestination,
[in] ULONG UTF8StringMaxByteCount,
[out] PULONG UTF8StringActualByteCount,
[in] PCWCH UnicodeStringSource,
[in] ULONG UnicodeStringByteCount
);
Параметры
[out] UTF8StringDestination
Указатель на выделенный вызывающим целевым буфером, в который подпрограмма записывает выходную строку UTF-8. Если этот параметр имеет значение NULL, подпрограмма записывает требуемый размер выходного буфера в *UTF8StringActualByteCount.
[in] UTF8StringMaxByteCount
Задает максимальное число байтов, которое подпрограмма может записывать в буфер, на который указывает UTF8StringDestination . Если UTF8StringDestination = NULL, задайте UTF8StringMaxByteCount = 0.
[out] UTF8StringActualByteCount
Указатель на расположение, в которое подпрограмма записывает фактическое количество байтов, записанных в буфер, на который указывает UTF8StringDestination . Если значение UTF8StringDestination не равно NULL, это число никогда не превышает значение UTF8StringMaxByteCount. Если UTF8StringDestination имеет значение NULL, это количество байтов, необходимых для хранения всей выходной строки.
[in] UnicodeStringSource
Указатель на исходную строку Юникода.
[in] UnicodeStringByteCount
Указывает количество байтов в исходной строке Юникода, на которое указывает параметр UnicodeStringSource .
Возвращаемое значение
RtlUnicodeToUTF8N возвращает STATUS_SUCCESS, если вызов выполнен успешно и все коды символов Юникода во входной строке были преобразованы в соответствующие коды символов UTF-8 в выходной строке. Он возвращает STATUS_SOME_NOT_MAPPED, если вызов выполнен успешно, но один или несколько входных символов были недопустимы и были заменены символом замены Юникода U+FFFD, прежде чем они были преобразованы в UTF-8. Возможные возвращаемые значения ошибок включают следующие коды ошибок:
Код возврата | Описание |
---|---|
|
Параметр UTF8StringMaxByteCount указывает размер буфера, который слишком мал, чтобы содержать всю выходную строку. |
|
Параметры UTF8StringDestination и UTF8StringActualByteCount имеют значение NULL. |
|
Параметр ЮникодStringSource имеет значение NULL. |
|
UnicodeStringByteCount не является целым числом, кратным sizeof(WCHAR). |
Комментарии
Выходная строка UTF-8 завершается null, только если входная строка Юникода завершается null.
Подпрограмма возвращает STATUS_BUFFER_TOO_SMALL, если параметр UTF8StringMaxByteCount указывает размер буфера, который слишком мал, чтобы содержать всю выходную строку. В этом случае подпрограмма записывает столько символов UTF-8, сколько поместится в буфере, а значение *UTF8StringActualByteCount указывает количество допустимых байтов, записанных подпрограммой в буфер. Частичная строка, содержащаяся в выходном буфере, может не содержать завершающий символ NULL.
Вы можете выполнить первоначальный вызов RtlUnicodeToUTF8N , чтобы получить требуемый размер буфера вывода, а затем снова вызвать RtlUnicodeToUTF8N , чтобы получить выходную строку Юникода. В начальном вызове задайте UTF8StringDestination = NULL и UTF8StringMaxByteCount = 0, и подпрограмма запишет необходимый размер буфера в значение *UTF8StringActualByteCount. Затем выделите буфер требуемого размера и вызовите RtlUnicodeToUTF8N во второй раз, чтобы получить выходную строку UTF-8.
RtlUnicodeToUTF8N поддерживает суррогатные пары Юникода. Однако суррогатное начальное значение слова, за которым не следует значение конечного слова, или значение в конце слова, которое не предшествует значению начального слова, не распознается как допустимый код символа и заменяется символом замены Юникода U+FFFD.
RtlUnicodeToUTF8N продолжает преобразовывать входную строку в выходную строку, пока не достигнет конца исходного буфера или конечного буфера в зависимости от того, что произойдет первым. Подпрограмма преобразует все пустые символы во входной строке в символы NULL в выходной строке. Если входная строка содержит завершающий символ NULL, но символ NULL не находится в конце исходного буфера, подпрограмма продолжается после завершающего символа NULL, пока не достигнет конца доступного буферного пространства.
Подпрограмма RtlUTF8ToUnicodeN преобразует строку UTF-8 в строку Юникода.
Вы можете использовать подпрограммы RtlUnicodeToUTF8N и RtlUTF8ToUnicode для выполнения преобразования допустимых текстовых строк без потерь между форматами Юникода и UTF-8. Однако строки с произвольными значениями данных, скорее всего, нарушают правила Юникода для кодирования суррогатных пар, а все сведения, содержащиеся в недопустимых значениях во входной строке, теряются и не могут быть восстановлены из результирующей выходной строки.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Доступно в Windows 7 и более поздних версиях Windows. |
Целевая платформа | Универсальное |
Верхняя часть | wdm.h (включая Ntifs.h, Wdm.h, Ntifs.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |