Ну, это зависит от того, что вы подразумеваете под «Юникод». Как говорят ответы, почти любой символ «является Unicode».
Windows использует термин «Unicode» для обозначения кодировки UTF-16LE, которую Win32 API использует для внутреннего использования. Вы можете обнаружить UTF-16, посмотрев спереди метку порядка байтов, байты FF FE
для UTF-16LE (или FE FF
для UTF-16BE). Возможно иметь текст UTF-16, который не помечен спецификацией, но это очень плохая новость, так как вы можете обнаружить его только с помощью догадок.
Чистая догадка - вот что такое функция IsTextUnicode
. Он просматривает входные байты и, видя, как часто встречаются в нем общие шаблоны, догадывается, насколько вероятно, что байты представляют символы в кодировке UTF-16LE или UTF-16BE. Поскольку каждая последовательность байтов потенциально является допустимой кодировкой символов (*), вы можете себе представить, что это не очень предсказуемо или надежно. И ты был бы прав.
См. Описание гуру Windows i18n Майкла Каплана из IsTextUnicode
и почему это, вероятно, не очень хорошая идея.
В общем, вам нужен более предсказуемый способ угадать, что представляет собой кодировка набора байтов. Вы можете попробовать:
- если он начинается
FE FF
, это UTF-16LE, что Windows воспринимает как «Unicode»;
- если он начинается
FF FE
, это UTF-16BE, что Windows одинаково обманчиво называет «обратным» Юникодом;
- в противном случае проверьте всю строку на наличие недопустимых последовательностей UTF-8. Если их нет, это, вероятно, UTF-8 (или просто ASCII);
- в противном случае попробуйте системную кодовую страницу по умолчанию.
(*: на самом деле не совсем так. Помимо таких символов, как U + FFFF, существует также множество последовательностей кодовых единиц UTF-16, которые не являются допустимыми символами, благодаря подходу «суррогаты» к кодирование символов за пределами 16-битного диапазона. Однако IsTextUnicode
в любом случае не знает о них, поскольку это предшествует астральным планам.)