不知道咋回事。
回顾下:
char* pTest1 = "测试.txt";
wchar_t* pTest2 = L"测试.txt";
以上是pTest1指向的内存数据是ANSI编码。一个汉字占2字节,英文符号占1字节。对应的数据是“B2 E2 CA D4 2E 74 78 74 00” 最后00是结束符'\0'的编码
pTest2指向的数据是Unicode编码,在windows上是UTF16-LE编码 。汉字和英文字符都占2字节。汉字字符编码与pTest1完全不一样,英文字符只是高8位扩展为0而已。对应的数据是:”4B 6D D5 8B 2E 00 74 00 78 00 74 00 00 00“ 最后的00 00是 ‘\0’的编码
看了下面这篇也没有解决:
http://blog.csdn.net/akof1314/article/details/5198537
另外,用Qt把string转换成UTF8也是错误,真是奇怪。
1 QString test_path = "C:\\Users\\Yajun Dou\\Desktop\\测试.jpg"; 2 QByteArray test_path2 = test_path.toUtf8(); 3 const char *test_path3 = test_path2.data(); 4 5 short* pDestImage = new short[1024*768]; 6 GetGrayPixelFormat16(test_path3, 1024, 768,pDestImage); 7 8 delete pDestImage;
上面的代码也是打开文件错误,GetGrayPixelFormat16内部调用了MagickReadImage这个函数(ImageMagick的接口),这个函数返回值是false。
然后用ImageMagick自带的显示图片的软件imdisplay.exe打开中文名的图片文件也是报错误,错误指向blob.c文件,但是ImageMagick自带的convert工具却能正确的打开并转换图片。
其中在convert的源码中发现了以下代码:
1 int wmain(int argc,wchar_t *argv[]) 2 { 3 char 4 **utf8; 5 6 int 7 status; 8 9 register int 10 i; 11 12 utf8=NTArgvToUTF8(argc,argv); 13 status=ConvertMain(argc,utf8); 14 for (i=0; i < argc; i++) 15 utf8[i]=DestroyString(utf8[i]); 16 utf8=(char **) RelinquishMagickMemory(utf8); 17 return(status == MagickFalse ? 0 : 1); 18 }
以上代码把agrv转成UTF-8了,那么按理来说,Qt那个函数转成UTF8也能成功啊??
再搜索下NTArgvToUTF8这个函数,在ImageMagick源码中的nt-base.c的文件中找到了。
代码如下:
1 MagickExport char **NTArgvToUTF8(const int argc,wchar_t **argv) 2 { 3 char 4 **utf8; 5 6 ssize_t 7 i; 8 9 utf8=(char **) AcquireQuantumMemory(argc,sizeof(*utf8)); 10 if (utf8 == (char **) NULL) 11 ThrowFatalException(ResourceLimitFatalError,"UnableToConvertStringToARGV"); 12 for (i=0; i < (ssize_t) argc; i++) 13 { 14 ssize_t 15 count; 16 17 count=WideCharToMultiByte(CP_UTF8,0,argv[i],-1,NULL,0,NULL,NULL); 18 if (count < 0) 19 count=0; 20 utf8[i]=(char *) AcquireQuantumMemory(count+1,sizeof(**utf8)); 21 if (utf8[i] == (char *) NULL) 22 { 23 for (i--; i >= 0; i--) 24 utf8[i]=DestroyString(utf8[i]); 25 utf8=(char **) RelinquishMagickMemory(utf8); 26 ThrowFatalException(ResourceLimitFatalError, 27 "UnableToConvertStringToARGV"); 28 } 29 count=WideCharToMultiByte(CP_UTF8,0,argv[i],-1,utf8[i],count,NULL,NULL); 30 utf8[i][count]=0; 31 } 32 return(utf8); 33 }
那么,就好好研究下以上的函数吧。
研究了以上函数,我仿写了一个:
1 static char *ToUTF8(wchar_t *path){ 2 3 char* utf8; 4 size_t count; 5 6 7 count = WideCharToMultiByte(CP_UTF8,0,path,-1,NULL,0,NULL,NULL); 8 9 if (count < 0) 10 count=0; 11 12 utf8 = new char [count + 1]; 13 14 count = WideCharToMultiByte(CP_UTF8,0,path,-1,utf8,count,NULL,NULL); 15 16 utf8[count] = '\0'; 17 18 //putf8 = &utf8; 19 20 return utf8; 21 22 }
至于以上函数的用法是这样的:
1 wchar_t * pPath = L"C:\\Users\\Yajun Dou\\Desktop\\测试.jpg"; 2 3 4 char* pTemp = ToUTF8((wchar_t*)pPath); 5 6 MagickReadImage(pTemp...); //ImageMagick的接口 7 8 delete pTemp; //注意,得delete删除ToUTF8内部分配的内存。
待我再用Qt来实现以上的功能
references:
http://blog.csdn.net/felomeng/article/details/9977061
http://blog.csdn.net/heyjimmy/article/details/1222257
http://blog.163.com/niuxiangshan@126/blog/static/170596595201282615626259/
http://blog.csdn.net/shenzi/article/details/4561158
http://blog.csdn.net/yangxiao_0203/article/details/7422660
http://blog.sina.com.cn/s/blog_76550fd701017v0x.html
http://blog.csdn.net/czl21/article/details/7264457
http://www.cnblogs.com/gakusei/articles/1585211.html
http://blog.csdn.net/xiongxiao/article/details/3741731