不知道咋回事。

回顾下:

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[*];
  6. GetGrayPixelFormat16(test_path3, , ,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=; i < argc; i++)
  15. utf8[i]=DestroyString(utf8[i]);
  16. utf8=(char **) RelinquishMagickMemory(utf8);
  17. return(status == MagickFalse ? : );
  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=; i < (ssize_t) argc; i++)
  13. {
  14. ssize_t
  15. count;
  16.  
  17. count=WideCharToMultiByte(CP_UTF8,,argv[i],-,NULL,,NULL,NULL);
  18. if (count < )
  19. count=;
  20. utf8[i]=(char *) AcquireQuantumMemory(count+,sizeof(**utf8));
  21. if (utf8[i] == (char *) NULL)
  22. {
  23. for (i--; i >= ; i--)
  24. utf8[i]=DestroyString(utf8[i]);
  25. utf8=(char **) RelinquishMagickMemory(utf8);
  26. ThrowFatalException(ResourceLimitFatalError,
  27. "UnableToConvertStringToARGV");
  28. }
  29. count=WideCharToMultiByte(CP_UTF8,,argv[i],-,utf8[i],count,NULL,NULL);
  30. utf8[i][count]=;
  31. }
  32. return(utf8);
  33. }

那么,就好好研究下以上的函数吧。

研究了以上函数,我仿写了一个:

  1. static char *ToUTF8(wchar_t *path){
  2.  
  3. char* utf8;
  4. size_t count;
  5.  
  6. count = WideCharToMultiByte(CP_UTF8,,path,-,NULL,,NULL,NULL);
  7.  
  8. if (count < )
  9. count=;
  10.  
  11. utf8 = new char [count + ];
  12.  
  13. count = WideCharToMultiByte(CP_UTF8,,path,-,utf8,count,NULL,NULL);
  14.  
  15. utf8[count] = '\0';
  16.  
  17. //putf8 = &utf8;
  18.  
  19. return utf8;
  20.  
  21. }

至于以上函数的用法是这样的:

  1. wchar_t * pPath = L"C:\\Users\\Yajun Dou\\Desktop\\测试.jpg";
  2.  
  3. char* pTemp = ToUTF8((wchar_t*)pPath);
  4.  
  5. MagickReadImage(pTemp...); //ImageMagick的接口
  6.  
  7. 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

ImageMaigck不支持中文路径的问题的更多相关文章

  1. 浅析GDAL库C#版本支持中文路径问题

    GDAL库对于C#的支持问题还是蛮多的,对于中文路径的支持就是其中之一(另一个就是通过OGR库获取图形的坐标信息). 关于C#支持中文路径,看过我之前博客的应该都不陌生,如果使用的是我修改过的GDAL ...

  2. svn不支持中文路径问题的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 svn的授权文件authz默认是不支持中文路径的,因此在精确控制中文文件夹的授权时往往会出错.要解决这个问题,需要用U ...

  3. GDAL支持中文路径和Shp文件中文属性写入

    在使用GDAL的过程中,为了支持中文,比需手动进行中文路径的设置,同时特别是在对Shp的属性进行中文输入的时候,都必须进行必要的设定. 为了支持中文路径,在注册了驱动之后,加上第三句就可以了.必须设置 ...

  4. 使GDAL库支持中文路径或中文文件名的处理方法

    之前生成的gdal 2.1.1动态库,在通过命令行执行时,遇到有中文路径或中文图像名时,GDALOpen函数不能正确的被调用,如下图: 解决方法: 1.      在所有使用GDALAllRegist ...

  5. 解决tomcat不支持中文路径的问题

    问题描述: 开发文件下载功能时,因为需求比较简单,要求下载一个说明文件.于是,直接给出了文件所在服务器的地址,通过链接直接下载此文件(因需求简单,未考虑安全方面的问题-_-||). 在这个过程中,文件 ...

  6. 【转】让apache支持中文路径或者中文文件

    本帖最后由 狂人阿川 于 2013-4-12 19:13 编辑 今天在给一美国VPS客户调试他的程序的时候.发现他的网站有中文名称.貌似apache无法认识中文路径,火狐下面能下载他的文件,IE下面不 ...

  7. 浅析GDAL库C#版本支持中文路径问题(续)

    上篇博客中主要说了GDAL库C#版本中存在的问题,其表现形式主要是:"文件名中的汉字个数是偶数,完全没有影响,读取和创建都正常,如果文件名中的汉字个数是奇数,读取和创建都会报错." ...

  8. Jenkins的FTP上传插件Publish Over FTP Plugin设置支持中文路径

    [系统管理]->[系统设置]->[Publish over FTP]->[Control encoding]->输入[GB2312]或者[UTF-8]

  9. gdal中文路径无法打开问题

    在C#中使用OGR读写矢量数据时,需要引用“using OSGeo.OGR;”. 同时为了处理中文路径和中文字段,需要在开始设置下面两个属性,代码如下: //为了支持中文路径,请添加下面这句代码(大多 ...

随机推荐

  1. 2015必须要看的APP源码

    多媒体类型 哔哩哔哩(bilibili)客户端源码 一个高仿哔哩哔哩(bilibili)客户端的开源项目,效果不错 下载地址: http://www.apkbus.com/forum.php?mod= ...

  2. bzoj有趣的题目

    你会发现bzoj上好多题AC率高的让人不敢想象 其实是因为数据没发,所以被n个人水过了-- 1142 1167 1351 1354 1359 1482 2812 3056 1469 我有特殊的减少代码 ...

  3. poj:2992 因子数量

    题意: 求 组合数c(n,k)的因子数量 由算术基本定理很容易求得,不过第一次却T了,加了好多预处理,o1查询,才过 #include <iostream> #include <st ...

  4. Ext中窗体第二次点击报错或者其内控件不显示的问题,弄了2天才解决,记录下

    registerPanel.js: registerPanel = new Ext.form.FormPanel({ id:'registerPanel', layout:'form', autoHe ...

  5. VS2012/2013编辑器问题

    1. Visual Studio 2013 'Could not evaluate Expression' Debugger Abnormality 解决办法:http://weblog.west-w ...

  6. 第18讲- UI常用组件之EditText

    第18讲UI常用组件之EditText 三.文本输入框EditText EditTex类继承自TextView.EditText是接受用户输入信息的最重要控件.在html当中,相当于<input ...

  7. SecureCRT 安装及初始化配置

    安装 SecureCRT 7.3.4 安装以及破解方法 SecureCRT 6.5.0 汉化解压版 初始化配置 这里配置以SecureCRT 6.5.0 汉化解压版为例 1.调整SecureCRT终端 ...

  8. QT实现透明效果的按钮

    QPushButton { color: rgb(0,88,152) background-color: rgba(97%,80%,9%,50%)}

  9. Ubuntu 12.04设置打开远程桌面登录1

    teamviewer_linux.deb sudo dpkg --install teamviewer_linux.deb

  10. CSS 实现三角形、梯形、等腰梯形

    三角形 ; width: 0px; border-width: 0px 30px 45px 145px; border-style: none solid solid; border-color: t ...