Как идентифицировать строки с кодировкой UTF-8
Какой лучший способ определить, может ли строка (есть или) быть кодирована UTF-8? Win32 API IsTextUnicode
здесь не очень помогает. Кроме того, строка не будет иметь спецификацию UTF-8, поэтому ее нельзя проверить. И, да, я знаю, что только символы над диапазоном ASCII закодированы с более чем 1 байтом.
Ответы
Ответ 1
chardet обнаружение набора символов, разработанное Mozilla, используемое в FireFox. Исходный код
jchardet - это java-порт источника из алгоритма автоматической кодировки мозаики.
NCharDet - это порт .Net(С#) порта Java на С++, используемый в браузерах Mozilla и FireFox.
Пример кода проекта С#, в котором используется Microsoft MLang для обнаружения кодировки символов.
UTRAC - это инструмент командной строки и библиотека, написанная на С++ для обнаружения строковой кодировки
cpdetector - это библиотека delphi, используемая для обнаружения кодирования
Еще одно полезное сообщение, указывающее на множество библиотек, которые помогут вам определить кодировку символов http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html
Вы также можете взглянуть на связанный с этим вопрос Как мне лучше всего угадать кодировку, когда спецификация (байтовый заказ) отсутствует?, у нее есть полезная содержание.
Ответ 2
Не существует действительно надежного способа, но в принципе, поскольку случайная последовательность байтов (например, строка в стандартной 8-битной кодировке) вряд ли будет действительной строкой UTF-8 (если самый старший бит байта, есть очень конкретные правила относительно того, какие байты могут следовать за ним в UTF-8), вы можете попробовать декодировать строку как UTF-8 и считать, что это UTF-8, если ошибок декодирования нет.
Определение того, были ли ошибки декодирования, является другой проблемой, многие библиотеки Unicode просто заменяют недопустимые символы вопросительным знаком, не указывая, произошла ли ошибка. Поэтому вам нужен явный способ определить, произошла ли ошибка при декодировании или нет.
Ответ 3
Эта страница W3C имеет регулярное выражение perl для проверки UTF-8
Ответ 4
В Windows вы можете использовать MultiByteToWideChar()
с кодовой страницей CP_UTF8
и MB_ERR_INVALID_CHARS
. Если функция не работает, строка недействительна UTF-8.
Ответ 5
Для Win32 вы можете использовать API-интерфейс mlang, это часть Windows и поддерживается Windows XP. Приятная вещь в том, что он дает вам статистику о том, насколько вероятен вход для конкретной кодировки:
CComPtr<IMultiLanguage2> lang;
HRESULT hr = lang.CoCreateInstance(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER);
char* str = "abc"; // EF BB BF 61 62 63
int size = 6;
DetectEncodingInfo encodings[100];
int encodingsCount = 100;
hr = lang->DetectInputCodepage(MLDETECTCP_NONE, 0, str, &size, &encodings, &encodingsCount);
Ответ 6
Чтобы выполнить распознавание символов в рубине установите драгоценный камень 'chardet'
sudo gem install chardet
Здесь немного ruby script, чтобы запустить chardet над стандартным входным потоком.
require "rubygems"
require 'UniversalDetector' #chardet gem
infile = $stdin.read()
p UniversalDetector::chardet(infile)
Chardet выводит гадание на кодировку набора символов, а также уровень достоверности (0-1) из его статистического анализа
см. также этот фрагмент
Ответ 7
автономная библиотека C/С++, основанная на детекторе набора символов Mozilla
https://github.com/batterseapower/libcharsetdetect
Универсальный детектор набора символов (UCSD) Библиотека, демонстрирующая интерфейс C и интерфейс без зависимостей с библиотекой UCSD Mozilla С++. Эта библиотека обеспечивает очень точный набор эвристик, которые пытаются определить набор символов, используемый для кодирования некоторого входного текста. Это чрезвычайно полезно, когда ваша программа должна обрабатывать входной файл, который поставляется без каких-либо метаданных кодировки.
Ответ 8
Вы не указали язык, но в PHP вы можете использовать mb_check_encoding
if(mb_check_encoding($yourDtring, 'UTF-8'))
{
//the string is UTF-8
}
else
{
//string is not UTF-8
}