user-0 提问: 如何判断URL汉字为哪种编码并相应解码？（C语言）

回复:
user: user-0
content: 好吧，最后我采用的是匹配1110xxxx，10xxxxxx，10xxxxxx方法为utf-8，虽然不完全靠谱。。。结贴

user: user-1
content: 引用 4 楼 user-5 的回复:刚好最近在弄 #include <cstdio>  #define UNICODE 1  #include <objbase.h> #include <comip.h> #include <mlang.h> #include <tchar.h>  typedef _com_ptr_t<_com_IIID<IMultiLanguage3, &IID_IMultiLanguage3>> IMultiLanguage3Ptr;  int main() { 	CoInitialize(NULL); 	{ 		IMultiLanguage3Ptr pML(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC); 		char data[] = { 0xD6, 0xD0, 0xCE, 0xC4, 0xB1, 0xE0, 0xC2, 0xEB }; 		int isize = sizeof(data); 		DetectEncodingInfo result[32]; 		int result_count = sizeof(result) / sizeof(result[0]); 		HRESULT hr = pML->DetectInputCodepage(MLDETECTCP_NONE, 0, data, &isize, result, &result_count); 		if (!SUCCEEDED(hr)) 		{ 			fprintf(stderr, "Failed with 0x%x\n", hr); 			CoUninitialize(); 			return hr; 		} 		for (int i = 0; i < result_count; i++) 		{ 			WCHAR desc[100] = {0}; 			pML->GetCodePageDescription(result[i].nCodePage, result[i].nLangID, desc, 100); 			printf("CP:%d (%S)\n", result[i].nCodePage, desc); 		} 	} 	CoUninitialize(); 	return 0; } 输出： CP:936 (Chinese Simplified (GB2312)) 引用 6 楼 zhao4zhong1 的回复:向4楼学习！ #define _UNICODE 1 #pragma warning(disable:4305 4309) #pragma comment(lib,"ole32") #pragma comment(lib,"comsupp") #include <cstdio> #include <objbase.h> #include <comip.h> #include <mlang.h> #include <tchar.h>  typedef _com_ptr_t<_com_IIID<IMultiLanguage3, &IID_IMultiLanguage3> > IMultiLanguage3Ptr;  int main() {     CoInitialize(NULL);     {         IMultiLanguage3Ptr pML(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC);         char data[] = { 0xD6, 0xD0, 0xCE, 0xC4, 0xB1, 0xE0, 0xC2, 0xEB };         int isize = sizeof(data);         DetectEncodingInfo result[32];         int result_count = sizeof(result) / sizeof(result[0]);         HRESULT hr = pML->DetectInputCodepage(MLDETECTCP_NONE, 0, data, &isize, result, &result_count);         if (!SUCCEEDED(hr))         {             fprintf(stderr, "Failed with 0x%x\n", hr);             CoUninitialize();             return hr;         }         for (int i = 0; i < result_count; i++)         {             WCHAR desc[100] = {0};             pML->GetCodePageDescription(result[i].nCodePage, result[i].nLangID, desc, 100);             printf("CP:%d (%S)\n", result[i].nCodePage, desc);         }     }     CoUninitialize();     return 0; }

user: user-2
content: HTTP协议，头部会指出所用编码格式。  你把整个http数据包抓出看下就知道了

user: user-0
content: 引用 5 楼 bravery36 的回复:utf8和gb2312的码库是重的，无法判定每个字符。唯一靠谱一点的是整段文字一起判定，有一个不是utf8的就是gb。就算是这样子也有例外，比如说我的同事全名就是无法判定utf8和gb的。 每三个字节判定符合utf-8的编码标准，不符合为gb的意思吗？ 那gb又如何解码？

user: user-0
content: 引用 4 楼 user-5 的回复:刚好最近在弄 #include <cstdio>  #define UNICODE 1  #include <objbase.h> #include <comip.h> #include <mlang.h> #include <tchar.h>  typedef _com_ptr_t<_com_IIID<IMultiLanguage3, &IID_IMultiLanguage3>> IMultiLanguage3Ptr;  int main() { 	CoInitialize(NULL); 	{ 		IMultiLanguage3Ptr pML(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC); 		char data[] = { 0xD6, 0xD0, 0xCE, 0xC4, 0xB1, 0xE0, 0xC2, 0xEB }; 		int isize = sizeof(data); 		DetectEncodingInfo result[32]; 		int result_count = sizeof(result) / sizeof(result[0]); 		HRESULT hr = pML->DetectInputCodepage(MLDETECTCP_NONE, 0, data, &isize, result, &result_count); 		if (!SUCCEEDED(hr)) 		{ 			fprintf(stderr, "Failed with 0x%x\n", hr); 			CoUninitialize(); 			return hr; 		} 		for (int i = 0; i < result_count; i++) 		{ 			WCHAR desc[100] = {0}; 			pML->GetCodePageDescription(result[i].nCodePage, result[i].nLangID, desc, 100); 			printf("CP:%d (%S)\n", result[i].nCodePage, desc); 		} 	} 	CoUninitialize(); 	return 0; } 输出： CP:936 (Chinese Simplified (GB2312)) 请问4楼，你这用了什么函数，能加个注释吗？另外，这个函数库识别出来之后可以解码吗？

user: user-3
content: 举个例子，比如python有个库，可以guess一下编码，可以做相关搜索。

user: user-0
content: 引用 1 楼 ForestDB 的回复:URL的encode只能是utf8？ 引用 1 楼 ForestDB 的回复:URL的encode只能是utf8？不全是，有些是gb2312如上面那个例子

user: user-3
content: URL的encode只能是utf8？

user: user-1
content: 向4楼学习！

user: user-4
content: utf8和gb2312的码库是重的，无法判定每个字符。唯一靠谱一点的是整段文字一起判定，有一个不是utf8的就是gb。就算是这样子也有例外，比如说我的同事全名就是无法判定utf8和gb的。

user: user-5
content: 刚好最近在弄 #include <cstdio>  #define UNICODE 1  #include <objbase.h> #include <comip.h> #include <mlang.h> #include <tchar.h>  typedef _com_ptr_t<_com_IIID<IMultiLanguage3, &IID_IMultiLanguage3>> IMultiLanguage3Ptr;  int main() { 	CoInitialize(NULL); 	{ 		IMultiLanguage3Ptr pML(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC); 		char data[] = { 0xD6, 0xD0, 0xCE, 0xC4, 0xB1, 0xE0, 0xC2, 0xEB }; 		int isize = sizeof(data); 		DetectEncodingInfo result[32]; 		int result_count = sizeof(result) / sizeof(result[0]); 		HRESULT hr = pML->DetectInputCodepage(MLDETECTCP_NONE, 0, data, &isize, result, &result_count); 		if (!SUCCEEDED(hr)) 		{ 			fprintf(stderr, "Failed with 0x%x\n", hr); 			CoUninitialize(); 			return hr; 		} 		for (int i = 0; i < result_count; i++) 		{ 			WCHAR desc[100] = {0}; 			pML->GetCodePageDescription(result[i].nCodePage, result[i].nLangID, desc, 100); 			printf("CP:%d (%S)\n", result[i].nCodePage, desc); 		} 	} 	CoUninitialize(); 	return 0; } 输出： CP:936 (Chinese Simplified (GB2312))