2009-08-05 4 views

ответ

4

Не надежно. Посмотрите на series Raymond Chen posts по этому вопросу.

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

+2

С помощью спецификации все еще неразличимо. Поэтому спецификация бесполезна в дополнение к тому, что она активно вредна. –

6

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

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

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

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

0

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

0

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

Смежные вопросы