如何最好地确定一个字符串是否(或可能)是UTF-8编码?Win32 API IsTextUnicode
在此方面帮助不大。此外,该字符串将没有UTF-8 BOM,因此无法进行检查。是的,我知道只有ASCII范围之上的字符才会编码为多个字节。
如何最好地确定一个字符串是否(或可能)是UTF-8编码?Win32 API IsTextUnicode
在此方面帮助不大。此外,该字符串将没有UTF-8 BOM,因此无法进行检查。是的,我知道只有ASCII范围之上的字符才会编码为多个字节。
chardet 是 Mozilla 开发的用于 FireFox 的字符集检测工具。 源代码
jchardet 是 Mozilla 自动字符集检测算法的 Java 移植版。
NCharDet 是一个 .Net (C#) 版本的 Mozilla 和 FireFox 浏览器中使用的 C++ 程序的 Java 移植版。
Code project C# 样例使用 Microsoft's MLang 来进行字符编码检测。
UTRAC 是一个用于检测字符串编码的命令行工具和 c++ 库。
cpdetector 是一个用于编码检测的 java 项目。
chsdet 是一个 Delphi 项目,是用于自动检测给定文本或文件的字符集 / 编码的独立可执行模块。
这篇有用的帖子指向了许多库,帮助你确定字符编码 http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html
您也可以查看相关问题如何在BOM(字节顺序标记)缺失时最佳猜测编码?,其中包含一些有用的内容。这个W3C页面提供了一个用于验证UTF-8编码的perl正则表达式。
您没有指定语言,但在PHP中,您可以使用mb_check_encoding
函数。
if(mb_check_encoding($yourDtring, 'UTF-8'))
{
//the string is UTF-8
}
else
{
//string is not UTF-8
}
对于Win32,您可以使用mlang API,这是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);
基于Mozilla字符集检测器的C/C++独立库
通用字符集检测器(UCSD) 这是一个库,它提供了一个C接口和无依赖的接口到Mozilla C++ UCSD库。该库提供了一组高度准确的启发式算法,试图确定用于编码某些输入文本的字符集。当您的程序必须处理没有任何编码元数据的输入文件时,这非常有用。MultiByteToWideChar()
函数,使用CP_UTF8
代码页和MB_ERR_INVALID_CHARS
标志。如果该函数失败,则字符串不是有效的UTF-8编码。sudo gem install chardet
require "rubygems"
require 'UniversalDetector' #chardet gem
infile = $stdin.read()
p UniversalDetector::chardet(infile)
#include <Mlang.h>
#include <objbase.h>
#pragma comment(lib, "ole32.lib")
HRESULT hr;
IMultiLanguage2 *pML;
char *pszBuffer;
int iSize;
DetectEncodingInfo lpInfo[10];
int iCount = sizeof(lpInfo) / sizeof(DetectEncodingInfo);
hr = CoInitialize(NULL);
hr = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER, &IID_IMultiLanguage2, (LPVOID *)&pML);
hr = pML->lpVtbl->DetectInputCodepage(pML, 0, 0, pszBuffer, &iSize, lpInfo, &iCount);
CoUninitialize();
但测试结果非常令人失望: