MFC: что будет регулярным выражением для проверки, является ли символ юникодом или нет? - PullRequest
2 голосов
/ 20 апреля 2010

Я пытаюсь использовать Windows IsTextUnicode API для проверки, является ли ввод символов в кодировке Unicode или нет, но это своего рода ошибка. Я подумал, что может быть лучше использовать регулярное выражение. Тем не менее, я новичок в построении регулярных выражений. Что будет регулярным выражением для проверки, является ли символ юникодом или нет?

Спасибо ...

Ответы [ 3 ]

1 голос
/ 20 апреля 2010

Я думаю, что вы смешиваете две разные концепции.Символ и его кодировка не совпадают.Некоторые символы (например, A) кодируются одинаково в ASCII или латинском-1 и UTF-8, некоторые нет, некоторые могут кодироваться только в UTF-8 и т. Д.

IsTextUnicode() пытается угадатькодировка из потока сырых байтов.

Если, с другой стороны, у вас уже есть символьное представление, и вы хотите выяснить, может ли оно быть изначально выражено как ASCII или latin-1, или какой-либо другой кодировкой, тогда вы действительно можете посмотреть надиапазон символов ([\u0000-\u007F] для ASCII).

Наконец, есть несколько недопустимых кодов (например, \uFFFE), которые являются возможными представлениями байтов, которые не допускаются в качестве символов Юникода.Но я не думаю, что это то, что вы ищете.

1 голос
/ 20 апреля 2010

Ну, это зависит от того, что вы подразумеваете под «Юникод». Как говорят ответы, почти любой символ «является 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 в любом случае не знает о них, поскольку это предшествует астральным планам.)

1 голос
/ 20 апреля 2010

Каждый персонаж, с которым вы столкнетесь, является частью Юникода. Например, латинский 'a' равен U+0061. Это особенно верно для Windows, которая изначально использует кодировку Unicode и UTF-16.

Функция Microsoft IsTextUnicode названа довольно к сожалению. Это может быть более точно описано как GuessTextEncodingFromRawBytes(). Я подозреваю, что ваша настоящая проблема не в интерпретации необработанных байтов, так как вы уже знаете, что это один символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...