UTF-8 может хранить любой символ Unicode. Если ваша кодировка - это что-то еще, включая ISO-8859-1 или Windows-1252, UTF-8 может хранить в нем каждый символ. Так что вам не нужно беспокоиться о потере каких-либо символов при преобразовании строки из любой другой кодировки в UTF-8.
Кроме того, ISO-8859-1 и Windows-1252 являются однобайтовыми кодировками, в которых допустим любой байт. Технически невозможно различить их. Я бы выбрал Windows-1252 в качестве соответствия по умолчанию для последовательностей, отличных от UTF-8, поскольку единственные байты, которые по-разному декодируют, это диапазон 0x80-0x9F. Они декодируют различные символы, такие как умные кавычки и евро в Windows-1252, тогда как в ISO-8859-1 они являются невидимыми управляющими символами, которые почти никогда не используются. Веб-браузеры могут иногда говорить, что они используют ISO-8859-1, но часто они действительно будут использовать Windows-1252.
будет ли этот код обеспечивать безопасную вставку строки в документ в кодировке UTF-8
Вы, безусловно, захотите установить для этого необязательного параметра ’strict’ TRUE. Но я не уверен, что это на самом деле охватывает все недопустимые последовательности UTF-8. Функция не претендует на явную проверку последовательности байтов на достоверность UTF-8. Известны случаи, когда mb_detect_encoding раньше угадывал UTF-8, хотя я не знаю, может ли это все-таки произойти в строгом режиме.
Если вы хотите быть уверенным, сделайте это самостоятельно, используя W3-рекомендуемое регулярное выражение :
if (preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string))
return $string;
else
return iconv('CP1252', 'UTF-8', $string);