这个问题经过我的调试发现:
  程序是在
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. zoj2562:搜索+数论(反素数)

    题目大意:求n以内因子数量最多的数  n的范围为1e16 其实相当于求n以内最大的反素数... 由素数中的 算数基本原理 设d(a)为a的正因子的个数,则 d(n)=(a1+1)(a2+1)..... ...

  2. ops

    consists several key projects separately stand-alone connected entities massive scalability massive ...

  3. 漫谈MySQL primaryKey

    主键没有着明确的概念定义,其是索引的一种,并且是唯一性索引的一种,且必须定义为“PRIMARY KEY”,是只可意会不可言传的东西.下面让我用通俗,甚至有些低俗的语言为您简单介绍一下MySQL的主键. ...

  4. (转)iOS7界面设计规范(7) - UI基础 - 交互性与反馈

    现在只是周日下午,可怎样都觉得整个周末就这样即将过去了,不免沮丧.看了好多集小丸子了,又不免觉得现在其实是在放暑假,可以一天一天的窝在家里做任何事,任何事.再上一篇iOS7设计规范,然后本周末就到这里 ...

  5. MVVM架构~knockoutjs系列之表单添加(验证)与列表操作源码开放

    返回目录 本文章应该是knockoutjs系列的最后一篇了,前几篇中主要讲一些基础知识,这一讲主要是一个实际的例子,对于一个对象的添加与编辑功能的实现,并将项目源代码公开了,共大家一起学习! knoc ...

  6. ajax(ajax开发)

    AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 JavaScript和 ...

  7. 使用游标循环进行SQL更新插入的SQL语句

    使用SQL中的循环,可以实现许多我们需要的操作,比如SQL更新操作.下面就为您介绍使用游标循环进行SQL更新插入的SQL语句写法,希望对您深入学习SQL更新有所帮助. --开始事务 BEGIN TRA ...

  8. static \ const \ volatile 的含义

    1.static 在函数体内,一个被声明为静态的变量在这一函数被调用的过程中维持其值不变 在模块内(函数体外),一个被声明为静态的变量可以被模块内的所有函数访问,但不能被模块外的其他函数访问,即它是一 ...

  9. SQLSERVER内核架构剖析 (转)

    我们做管理软件的,主要核心就在数据存储管理上.所以数据库设计是我们的重中之重.为了让我们的管理软件能够稳定.可扩展.性能优秀.可跟踪排错. 可升级部署.可插件运行,我们往往研发自己的管理软件开发平台. ...

  10. MySQL 数据库入门操作

    启动mysqld:在命令行启动mysql时,如不加"--console",启动.关闭信息不在界面中显示,而是记录在安装目录下的data目录里,文件名一般是hostname.err, ...