Я не знаю, в чем причина вашей проблемы, но это не ограничение UTF-8 или ошибка в процессе кодирования. UTF-8 может кодировать каждый символ, известный Unicode, и проблемные последовательности байтов (ED BF 9D
и ED B4 82
) действительны - то есть первый байт начинается с 1110
, чтобы указать трехбайтовую последовательность, и каждый из двух других байтов начинается с 10
, как предполагается, для продолжения байтов. Это значения, которые они пытаются кодировать , которые являются недействительными.
Unicode и ISO / IEC 10646 не присваивают и никогда не будут присваивать символы ни одной из кодовых точек в диапазоне U + D800 – U + DFFF, поэтому отдельное значение кода из суррогатной пары никогда не представляет символ , -Wikipedia
Ваши проблемные символы: U+DFDD
и U+DD02
. Тот факт, что есть два символа из диапазона, используемого для суррогатных пар, может показаться предполагающим, что они должны были быть суррогатной парой, но это не работает. Это UTF-16, который использует суррогатные пары; UTF-8 будет кодировать символ в виде одной четырехбайтовой последовательности.
Другой возможностью является модифицированный UTF-8 , который действительно кодирует каждый байт суррогатной пары в отдельности. Но это также не работает: суррогатная пара всегда состоит из одного байта из диапазона высоких суррогатов (U+DC00..U+DFFF
) и одного байта из диапазона низких суррогатов (U+D800..U+DBFF
). Эти персонажи оба из высшего суррогатного диапазона.
Так что, похоже, дело в плохих данных, а не в неправильном кодировании. Было бы очень полезно, если бы мы знали, какими должны быть эти персонажи. В противном случае, некоторая информация о том, какие данные вы ожидаете (например, на каких языках), откуда эти данные поступили, что с ними сделали ... такого рода вещи.