Вопрос предполагает, что существует фундаментальное различие между строкой и двоичными данными. Хотя это интуитивно так, почти невозможно точно определить, что это за разница.
Строка Java представляет собой последовательность из 16 битовых величин, которые соответствуют одному из (почти) 2 ** 16 базовых кодов Unicode. Но если вы посмотрите на эти 16-битные «символы», каждый из них может в равной мере представлять целое число, пару байтов, пиксель и т. Д. Битовые шаблоны не имеют ничего внутреннего, что говорит о том, что они представляют.
Теперь предположим, что вы перефразировали свой вопрос как просящий способ отличить TEXT, кодированный UTF-8, от произвольных двоичных данных. Помогает ли это? Теоретически нет, потому что битовые шаблоны, которые кодируют любой письменный текст, также могут быть последовательностью чисел. (.? Трудно сказать, что «произвольное» на самом деле означает, что здесь Вы можете сказать мне, как проверить, является ли число «произвольное»)
Лучшее, что мы можем сделать здесь следующее:
- Проверьте, являются ли байты действительной кодировкой UTF-8.
- Проверка, если декодированные 16-битные величины являются законными, «назначены» кодовыми точками UTF-8. (Некоторые 16-битовые величины являются незаконными (например, 0xffff), а другим в настоящее время не назначено, чтобы соответствовать любому символу.) Но что, если текстовый документ действительно использует неназначенный код?
- Проверьте, соответствуют ли кодовые страницы Unicode «плоскостям», которые вы ожидаете, на основе предполагаемого языка документа. Но что, если вы не знаете, какого языка ожидать, или если документ, который использует несколько языков?
- Тестирование последовательности кодовых точек выглядит как слова, предложения или что-то еще. Но что, если бы у нас были некоторые «двоичные данные», которые включали встроенные текстовые последовательности?
Таким образом, вы можете сказать, что последовательность байтов определенно не является UTF-8, если декодирование завершается с ошибкой. Помимо этого, если вы сделаете предположения о языке, вы можете сказать, что последовательность байтов , вероятно, или , вероятно, не кодированный текстовый документ UTF-8.
ИМО, самое лучшее, что вы можете сделать, это не попасть в ситуацию, когда программа должна принять это решение. И если этого не избежать, узнайте, что ваша программа может ошибиться. С мыслью и напряженной работой вы можете сделать это маловероятным, но вероятность никогда не будет равна нулю.
Аналогичный вопрос имеет некоторые полезные ссылки от Edward Wilde - http://stackoverflow.com/questions/377294/howto-identify-utf- 8-кодированные строки – JonoW