1、IMultiLanguage3 或者 IMultiLanguage2
1.1、怎么判断XML 的编码格式(UTF-8或GB2312等)-CSDN论坛.html(https://bbs.csdn.net/topics/391919768)
1.2、查看当前编码(代码页) - lslsyqyq的专栏 - CSDN博客.html(https://blog.csdn.net/lslsyqyq/article/details/80858048)
1.3、测试代码:(vs08x86)
//#define _UNICODE 1
//#pragma warning(disable:4305 4309)
#pragma warning(disable:4309)//warning C4309: “初始化”: 截断常量值
#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; // https://bbs.csdn.net/topics/391919768
int main()
{
CoInitialize(NULL);
{
IMultiLanguage3Ptr pML(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC);
//char data[] = { 0xD6, 0xD0, 0xCE, 0xC4, 0xB1, 0xE0, 0xC2, 0xEB };
//char data[] = { 0xD7, 0xB4, 0xCC, 0xAC, 0xCD, 0xBC, 0xD4, 0xAA };//, 0x74, 0x65, 0x73, 0x74 };
char data[] = { 0xD7, 0xDD, 0x9C, 0xAB, 0xCD, 0xBB, 0xD4, 0xA9 };
int isize = sizeof(data);
DetectEncodingInfo result[];
int result_count = sizeof(result) / sizeof(result[]);
//HRESULT hr = pML->DetectInputCodepage(MLDETECTCP_NONE, 0, data, &isize, result, &result_count);
HRESULT hr = pML->DetectInputCodepage(MLDETECTCP_NONE, , data, &isize, result, &result_count);
if (!SUCCEEDED(hr))
{
fprintf(stderr, "Failed with 0x%x\n", hr);
CoUninitialize();
return hr;
}
for (int i = ; i < result_count; i++)
{
WCHAR desc[] = {};
pML->GetCodePageDescription(result[i].nCodePage, result[i].nLangID, desc, );
printf("CP:%d (%S)\n", result[i].nCodePage, desc);
}
}
CoUninitialize(); // D7 B4 CC AC CD BC D4 AA
system("pause");
return ;
}
下面是一个 GBK编码的 中文字符串的 char数组信息:
char data[] = { 0xD6, 0xD0, 0xCE, 0xC4, 0xB1, 0xE0, 0xC2, 0xEB };// 中文编码
//char data[] = { 0xD7, 0xB4, 0xCC, 0xAC, 0xCD, 0xBC, 0xD4, 0xAA };// 状态图元
//char data[] = { 0xD7, 0xDD, 0xCC, 0xAB, 0xCD, 0xBB, 0xD4, 0xAA };// 纵太突元
1.4、IMultiLanguage2 interface (Windows) _ Microsoft Docs.html(https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa741001%28v%3dvs.85%29)
1.5、IMultiLanguage2__DetectInputCodepage method (Windows) _ Microsoft Docs.html(https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa740986%28v%3dvs.85%29)
ZC:使用 IMultiLanguage2或IMultiLanguage3的DetectInputCodepage 来分析 "状态图元"、"纵太突元"的字符数组,会分不清是 GB2312和UTF8 也是有原因的,∵ Windows自己就搞不清.. 尝试 打开Win7x64的记事本,输入2个字"状态",然后 CTRL+S保存(默认保存,不手动选择字符编码),然后再打开记事本,发现里面的数据是乱码,然后 再"另存为" 此时看到 Windows自己识别出来的编码是"UTF-8",可见 Windows自己都分不清楚 GBK 和 不规范的UTF8 编码...
2、
3、
4、Java的相关资料:
4.1、Java读取文件,判断是否UTF-8的解决方案 - 墨的博客 - CSDN博客.html(https://blog.csdn.net/dreamworld204/article/details/79286793)
首先,UTF-8的编码方式: 1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 实际上都在3字节内,没有遇到4字节以上编码的。根据其编码格式我们就可以文件进行一定的验证了,例如:(ZC:后面是一段代码,这里省略)
4.2、jchardet
ZC:前面尝试 C/C++的chardet,感觉 好蛋疼难受... 查了下,发现 jchardet 却是资料颇多 而且已经是别人从python翻译过来弄好的 不需要自己编译什么的 用就行了
ZC:思路:可以将java的代码 封装成 jar(它的检测结果输出到文件中),然后 C/C++ 使用命令行方式执行这个jar 在命令行中读取到jar写入到了那个文件的文件名(或使用固定路径固定文件名),然后 C/C++再去读取 jar的输出文件 (疑问:C/C++ 使用命令行方式执行这个jar,不会立即返回吧?应该是等jar执行完后再返回吧?)
ZC:下面 2篇文章还未细看:
(1)、字符集编码的自动识别jchardet - 云守护的专栏 - CSDN博客.html(https://blog.csdn.net/earbao/article/details/38709701)
(2)、jChardet探测文件字符编码-博客-云栖社区-阿里云.html(https://yq.aliyun.com/articles/59514)
ZC:这里的代码,在检测 D:\DRGIS\BIN\Graphics里面的图形时,若 文件是 UTF-8编码的,则它显示是 ASCII;若文件是 UTF-8 + BOM编码的,则它显示是 UTF8.看起来 不太准...
(3)、借助JCharDet获取文件字符集 - robin·张 - 博客园.html(https://www.cnblogs.com/amunote/p/4178472.html)
ZC:这个文章里面的代码,在检测 D:\DRGIS\BIN\Graphics里面的图形时 能检测出 UTF-8编码的文件是UTF8编码
ZC:看来 都是使用的 chardet.jar,编写的代码不一样 效果也是不同的。原始工具一样 使用者 水平很关键
ZC:我的测试代码 位于:文件编码检测.测试代码 - JavaSkill - 博客园.html(https://www.cnblogs.com/javaskill/p/10015676.html)
5、