Предполагая, что под "ANSI" вы на самом деле имеете в виду один из вариантов ISO 8859, мы должны начать с пары пунктов.
Во-первых, не каждая строка может быть преобразована из UTF-8 (илиUnicode в целом, независимо от используемого преобразования) в ISO 8859. Unicode имеет уникальную кодовую точку практически для каждого символа в каждом языке на Земле.
ISO 8859 поддерживает гораздо меньше языков и имеет отдельный набор символов длякаждый язык, который он поддерживает;одни и те же коды представляют разные символы на разных языках.
Это означает, что входная строка UTF-8 довольно легко содержит символы, которые вообще не могут быть представлены ни в одном из вариантов ISO 8859, а также легкоон должен содержать символы, для представления которых требуются разные варианты ISO 8859.
Во-вторых, даже в лучшем случае преобразование может быть весьма нетривиальным.Если это вообще возможно, вы почти наверняка захотите использовать библиотеку (например, libiconv) для этой задачи.Например, Unicode имеет ... функцию, называемую "объединение диакритических знаков", которая позволяет вам кодировать что-то вроде "A с острым акцентом" как одну кодовую точку или две отдельные кодовые точки (однадля «А» и другой для акцента).Чтобы закодировать это в ISO 8859, вам придется преобразовать их все в одну форму (обычно это предварительно комбинированная форма).
Прежде чем выполнять какую-либо значительную работу с Юникодом, вы также обычно хотите преобразоватьUTF-8 в UCS-4.
Итак, последовательность будет выглядеть примерно так:
- Преобразование UTF-8 в UCS-4
- Преобразование комбинированных диакритических знаковв буквы с диакритическими знаками (возможно, NFKC).
- Убедитесь, что все символы могут быть закодированы в целевом наборе символов
- Преобразовать в целевой набор
В зависимости отесли вы предпочитаете делать что-то, вы можете объединить 3 и 4 в один шаг, преобразовывая символы по ходу и, например, выбрасывая исключение, если вы встретите символ, который не может быть представлен в целевом наборе символов.