文件编码检测.ZC一些资料

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[32];
        int result_count = sizeof(result) / sizeof(result[0]);
        //HRESULT hr = pML->DetectInputCodepage(MLDETECTCP_NONE, 0, data, &isize, result, &result_count);
        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();


    // D7 B4 CC AC CD BC D4 AA 
    system("pause");
    return 0;
}

    下面是一个 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

5、

猜你喜欢

转载自www.cnblogs.com/cppskill/p/9906599.html