Чтобы понять, что нужно сделать, вы должны сначала понять немного фона. Разные кодировки используют разные значения для «одного и того же» символа. Например, Latin-1 говорит, что «é» - это один байт со значением E9 (hex), в то время как UTF-8 говорит, что «é» - это двухбайтовая последовательность C3 A9, и, тем не менее, UTF-16 говорит, что один и тот же символ является единственным двухбайтовое значение 00E9 - одно 16-битное значение, а не два 8-битных, как в UTF-8. (Unicode, который не является кодировкой, фактически использует то же значение кодовой точки, U + E9, что и Latin-1.)
Для преобразования из одной кодировки в другую сначала необходимо принять закодированное значение, декодировать его до значения, не зависящего от исходной кодировки (т. Е. Кодовой точки Unicode), а затем перекодировать его в целевую кодировку. Если целевая кодировка не поддерживает все кодовые точки исходной кодировки, вам нужно либо перевести, либо иным образом обработать это условие.
Этот шаг перекодировки требует знания как исходного, так и целевого кодировок.
Ваша функция API не конвертирование кодировок; кажется, что URL-экранирует произвольную строку байтов. Авторы функции, по-видимому, предполагают, что уже будет преобразовано в UTF-8.
Чтобы выполнить преобразование в UTF-8, вы должны знать, какую кодировку использует ваша система, и уметь сопоставлять кодовые точки Unicode. Оттуда кодировка UTF-8 становится тривиальной.
В зависимости от вашей системы это может быть так же просто, как преобразование «родного» набора символов (который для вас имеет «é» как E9, так что, вероятно, Windows-1252, Latin-1 или что-то очень похожее) в широкие символы (что, вероятно, UTF-16 или UCS-2, если sizeof (wchar_t) равно 2, или UTF-32, если sizeof (wchar_t) равно 4), а затем в UTF-8. Wcstombs, как отвечает Мартин, может справиться со второй частью этого преобразования, но это зависит от системы. Однако я считаю, что Latin-1 является подмножеством Unicode, поэтому преобразование из этой исходной кодировки может пропустить шаг широких символов. Windows-1252 близка к Latin-1, но заменяет некоторые управляющие символы печатными символами.