Проверьте, содержит ли строка char * многобайтовые символы - PullRequest
4 голосов
/ 16 февраля 2011

Я получаю буфер потока байтов с сервера TCP, который может содержать многобайтовые символы, образующие символы Юникода.Мне было интересно, всегда ли есть способ проверить, чтобы спецификация обнаруживала этих персонажей или как бы вы хотели это сделать?

Ответы [ 4 ]

8 голосов
/ 16 февраля 2011

Если вы знаете, что данные имеют формат UTF-8, вам просто нужно проверить старший бит:

  • 0xxxxxxx = однобайтовый символ ASCII
  • 1xxxxxxx = часть многобайтового символа

Или, если вам нужно различить байты отведения / следа:

  • 10xxxxxx = 2-й, 3-й или 4-й байт многобайтового символа
  • 110xxxxx = 1-й байт 2-байтового символа
  • 1110xxxx = 1-й байт 3-байтового символа
  • 11110xxx = 1-й байт 4-байтового символа
2 голосов
/ 16 февраля 2011

Существует множество способов обнаружения многобайтовых символов, и, к сожалению ... ни один из них не является надежным.

Если это возвращаемый веб-запрос, проверьте заголовки, поскольку заголовок Content-Type часто будет указывать кодировку страницы (которая может указывать на наличие многобайтовых символов).

Вы также можете проверить наличие спецификаций, так как они являются недопустимыми символами, и в любом случае они не должны появляться в обычном тексте, поэтому не мешало бы увидеть, есть ли они там. Однако они являются необязательными и много раз не будут присутствовать (зависит от реализации, конфигурации и т. Д.).

1 голос
/ 19 февраля 2011

В UTF-8 все, что имеет 8-й бит, является частью многобайтовой кодовой точки.Таким образом, проверка (0x80 & c)!=0 для каждого байта - это самый простой способ сделать это.

1 голос
/ 16 февраля 2011

спецификации в основном необязательны.Если сервер, с которого вы получаете, обслуживает многобайтовые символы, он может предположить, что вы это знаете, и сохранить 2 байта для спецификации.Вы запрашиваете способ определить, могут ли полученные вами данные быть многобайтовой строкой?

...