Проверить, содержит ли буфер char * символы UTF8? - PullRequest
2 голосов
/ 05 августа 2009

В отсутствие спецификации существует быстрый и грязный способ, которым я могу проверить, содержит ли буфер * char символы UTF8?

Ответы [ 4 ]

6 голосов
/ 05 августа 2009

Вы можете проверить гипотезу, что это возможно, но я верю, что вы можете только в конечном итоге знать, что это не с уверенностью. Другими словами, вы можете проверить буфер, чтобы убедиться, что все байтовые последовательности являются допустимыми UTF-8, что кодовые точки представлены наименьшим числом байтов, что отсутствуют 16-битные суррогатные коды и т. Д. Буфер, который отвечает всем этим критериям, может показаться текстовым, но вас могут обмануть.

В дополнение к обсуждению Рэймонда Чена в Old New Thing, цитируемому ответом Марка Пима, буфер мог фактически содержать машинный код x86, который, как оказалось, ограничен подмножеством, которое, похоже, является 7-битным печатаемым ASCII. Удивительно, но на самом деле вы можете писать значимые программы в этом подмножестве, одним из примеров которого является EICAR антивирусный тестовый вирус.

Конечно, буфер, который содержит последовательности байтов с искаженным UTF-8, вероятно, вообще не является текстом UTF-8. В этом случае у вас высокая степень доверия. Тогда уловка состоит в том, чтобы выяснить, какая кодировка может быть на самом деле.

Если вы знаете (или можете предположить) что-то о семантическом содержании буфера, то вы также можете использовать это для поддержки своего определения. Например, если предполагается, что в буфере содержится текст на английском языке, маловероятно, что в нем есть кодовые точки с корейского языка, и он должен быть написан правильно, следовать английской грамматике и т. Д. Конечно, это может дорого обойтись ...

4 голосов
/ 05 августа 2009

Ненадежно. См. серию из *1003* сообщений Рэймонда Чена на эту тему.

Проблема в том, что UTF-8 без спецификации слишком часто неотличим от одинаково правильной кодировки ANSI. Я думаю, что большинство решений (например, win32 API IsTextUnicode) используют различные эвристики, чтобы дать наилучшее представление о формате текста.

0 голосов
/ 24 мая 2011

Просто проверьте, что последовательность байтов действительна как UTF-8. Если это так, то вероятность того, что он будет значимым текстом в любой другой кодировке, по существу равна нулю.

0 голосов
/ 05 августа 2009

Быстро и грязно, вы не можете сделать намного лучше, чем регулярное выражение на этой странице . Если вы просто хотите узнать, безопасно ли декодировать байты как UTF-8, это все, что вам нужно.

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