这个问题经过我的调试发现:
  程序是在
while (*at && !isdigit(*at)) at++;  
这个语句时crash的,但是跟进去是isdigit的问题,因为变量at的声明是char* at;  当at指向一个中文路径的时候,在传递给 isdigit时,*at类型很明显,隐式转换成为了int,因为  isdigit(int c)是这样声明的。所以这个时候一下子int c变成了一个负数:0xffffffb2,然后再往下跟进执行到 _ASSERTE((unsigned)(c + 1) <= 256);这个语句才崩溃的,因为强制转换成无符号的int,变成了一个很大的正数。明显不满足断言条件,所以程序当然crash了。
 
以上的crash情况只有在Debug版本才会crash,Release版本就不会出问题。原因已经在微软带的CRT库的源码中看出来了
 
结论:
   应该是我们使用的问题,中文windows默认的locale是GB2312的,我们很可能却调用ASCII版本的 isdigit函数(所以遇到中文立即crash),这已经不符合逻辑了,咱不可能手动去改变locale。
 
下面是opencv源码中造成崩溃的函数源码(注意第三十行造成crash的语句):
 static char* icvExtractPattern(const char *filename, unsigned *offset)
{
char *name = (char *)filename; if( !filename )
return ; // check whether this is a valid image sequence filename
char *at = strchr(name, '%');
if(at)
{
int dummy;
if(sscanf(at + , "%ud", &dummy) != )
return ;
name = strdup(filename);
}
else // no pattern filename was given - extract the pattern
{
at = name; // ignore directory names
char *slash = strrchr(at, '/');
if (slash) at = slash + ; #ifdef _WIN32
slash = strrchr(at, '\\');
if (slash) at = slash + ;
#endif while (*at && !isdigit(*at)) at++; if(!*at)
return ; sscanf(at, "%u", offset); int size = (int)strlen(filename) + ;
name = (char *)malloc(size);
strncpy(name, filename, at - filename);
name[at - filename] = ; strcat(name, "%0"); int i;
char *extension;
for(i = , extension = at; isdigit(at[i]); i++, extension++)
;
char places[];
sprintf(places, "%dd", i); strcat(name, places);
strcat(name, extension);
} return name;
}

下面是个最小的崩溃场景例子:

 #include<ctype.h>
#include<stdio.h> int main(){ char *pPath = "测试视频";
#if defined (_DEBUG)
if(!isdigit(*pPath)){
printf("its not digit\n");
}
#else
if(!iswdigit(*pPath)){
printf("Release its not digit\n");
}
#endif
return ;
}

以下是一个测试:

 #include <stdio.h>
#include <Windows.h> int NarrowChar() {
char *pcAlpha = "啊";
printf("pcAlpha = 0x%08X!\n", *pcAlpha); //0xFFFFFFB0
return ;
} int WideChar() {
//wchar_t *pwcAlpha = L"A";
wchar_t *pwcAlpha = L"啊";
printf("pwcAlpha = 0x%08X!\n", *pwcAlpha); //0x0000554A UTF-16-little-endian
//wprintf(L"pwcAlpha = 0x%08X!\n", *pwcAlpha); //0x0000554A
return ;
} int main(void) {
NarrowChar();
WideChar(); return ;
}

由以上可以看出来,字符串这个前缀‘L’实质上是对字符串从ANSI字符集转换为Unicode字符集,也就是UTF-16编码。如果不加这个L前缀就是ANSI/ASCII字符集。

以上的问题我前博文已经研究过了。

################################update#############################

结论:

经过调试测试,其实就是cvCreateFileCapture函数返回失败的原因,在opencv 2.4.9和opencv2.4.10中就有问题,就是都返回失败,而2.4.6就不会

references:

http://www.cppblog.com/luonjtu/archive/2009/03/13/76332.html

http://comments.gmane.org/gmane.comp.lib.opencv.devel/1274

http://msdn.microsoft.com/en-us/library/windows/desktop/ff381407(v=vs.85).aspx

http://blog.csdn.net/xiaobai1593/article/details/7063535

http://stackoverflow.com/questions/8032080/how-to-convert-char-to-wchar-t

 

使用opencv传中文文件崩溃的更多相关文章

  1. php上传中文文件文件名乱码问题

    php上传文件是最最基础的一个技术点,但是深入进去也有不少问题需要解决,这不,上传中文文件后,文件名变成了乱码. 下面是问题代码,很简单: 1.问题代码 html部分: <html> &l ...

  2. moodle3.7上传中文文件,无法引用,图片不显示

    初始安装moodle3.7 上传图片,名称为中文时,无法引用图片,图片不显示.这里采用修改moodle根目录下的config.php文件, 添加了变量$CFG->slasharguments = ...

  3. ASP.Net上传中文文件乱码

    只要在Head中添加即可解决:<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />

  4. 上传中文文件到linux文件出现乱码问题的解决方案

    convm -f gbk -t utf8 -r --notest /ftp的目录 效果:

  5. ASP无惧上传类不能上传中文双引号文件及ASP函数InStr存在bug

    ASP无惧上传类不能上传中文双引号文件及ASP函数InStr存在bug 近日发现eWebEditor V2.8 asp 版本上传文件文件名不能包含中文双引号,发现eWebEditor使用ASP“无惧上 ...

  6. VFS 上传文件到sftp 报错 包含中文路径 或者中文文件名称

    之前用Apache commons-vfs工具进行ftp操作(FTP服务器是 FileZilla Server) 上传本地文件 到 ftp服务器上,如果文件名称 包含 中文 报错 org.apache ...

  7. wordpress 支持上传中文名称文件

    添加文章难免要传个图.文件啥的,可是呢,上传中文名称的文件竟然不行,找了半天,中文乱码,脑残了,竟然忘了这个事,哎 修改其实很简单,只需要两步 1./wp-admin/includes/file.ph ...

  8. Flask下如何处理Requests 上传中文文件名的问题

    一.问题的由来     最近有个项目,叫做文档服务资源中心,类似于七牛,为各个业务系统提供统一的文件资源服务,包括文件的存储.操作管理.下载.预览等.在做文件存储的时候,遇到了这个当指定上传的文件名为 ...

  9. IE下get传中文乱码的问题完美解决方案

    前几天做项目的时候遇到需要在easyui的combobox的url中以get的方式传中文,出现乱码. $('#cc').combobox({ url : 'xxxAction.action?para= ...

随机推荐

  1. SQL判断一个数是整数还是小数

    DECLARE @number1 AS numeric(10,2),@number2 AS numeric(10,2) SELECT @number1=10.00,@number2=10.2 SELE ...

  2. 玩Linux桌面发现一个最佳的组合配置

    其实前段时间玩Arch,其实不难,主要是太浪费时间配置折腾了,学到有用的东西太少,不能让我快速进入编程工作的状态,(真不知道有些人用Gentoo和Arch都能用出优越感了,就因为难安装和配置??)但是 ...

  3. windows 挂载linux nfs

    windwos挂载linux主机NFS 启动windos NFS客户端服务: 1. 打开控制面板->程序->打开或关闭windows功能->NFS客户端 勾选NFS客户端,即开启wi ...

  4. Resty 一款极简的restful轻量级的web框架

    https://github.com/Dreampie/Resty Resty 一款极简的restful轻量级的web框架 开发文档 如果你还不是很了解restful,或者认为restful只是一种规 ...

  5. bzoj1188

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1188 一道非常好的SG函数题,加深了对博弈论的理解. 以前做的SG函数的题,都是每个瓶子看成一 ...

  6. jquery 的ready() 与window.onload()的区别

    做web开发时常用Jquery中$(document).ready()和JavaScript中的window.onload方法,两者都是要在页面加载完成以后加载的方法,但是这两者还是有很大区别的.最近 ...

  7. spoj1812-Longest Common Substring II(后缀自动机)

    Description A string is finite sequence of characters over a non-empty finite set Σ. In this problem ...

  8. JS字符串拼接优化

    // 请把以下用于连接字符串的JavaScript代码修改为更高效的方式 var htmlString = ‘ < div class=”container” > ’ + ‘ < u ...

  9. 自写图片遮罩层放大功能jquery插件源代码,photobox.js 1.0版,不兼容IE6

    阿嚏~~~ 话说本屌丝没啥开发插件的经验,可是天公不作美,公司须要让我自己开发个图片放大的插件 但公司老大的话,宛如吾皇之圣旨,微臣必当肝脑涂地,莫敢不从啊~~~ 于是乎,作为一个超级小白,本人仅仅能 ...

  10. iphone开发 IOS 组织架构图

    转载自 :http://blog.csdn.net/mashi321323/article/details/18267719   登录|注册     mashi321323的专栏       目录视图 ...