这个问题经过我的调试发现:
  程序是在
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. 【Xamarin 在Mac OS 上的部署安装环境】

    ******************没用Mac 的机子,也只能靠虚拟机了**********1 安装VMware 10 从网上下载即可2 下载MAC OS 10.9.5的安装镜像,网上有很多,最好使用 ...

  2. Unit Test相关问题汇总

    1.测试私有方法(1)使用反射 public class Calcutate { public int test() { return add(2, 3); } private int add(int ...

  3. bzoj 1197

    http://www.lydsy.com/JudgeOnline/problem.php?id=1197 我们考虑从低维向高维考虑. 记F[i][j]表示维度为i,用了j个球时最多能将空间划分为多少个 ...

  4. back_inserter的用法

    1,代码如下: #include<iostream> #include<list> #include<algorithm> #include<iterator ...

  5. Codeforce 217 div2

    C 假设每种颜色的个数都相同,可以用轮换的方式,让答案达到最大n,当不同的时候,可以每次从每种颜色中取出相同个数的手套来操作; 一直迭代下去直到只剩下1种颜色; 再将这一种颜色与之前交换过的交换就行了 ...

  6. redis 学习笔记三(队列功能)

    Redis队列功能介绍 List 常用命令: Blpop删除,并获得该列表中的第一元素,或阻塞,直到有一个可用 Brpop删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用 Brpoplpus ...

  7. poj 2251 Dungeon Master(bfs)

    Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is co ...

  8. 如何实现带照片缩略图的Listview

    ackage com.demo; import java.util.ArrayList; import android.app.Activity; import android.content.Con ...

  9. 私人C#笔记

      coust 定义常量 string是密封类,所以不能继承它 namespace默认是按照文件夹的结构命名的,如(System.文件夹.子文件夹),而且namespace是可以手动改的   Arra ...

  10. ORACLE SQL单行函数(二)【weber出品必属精品】

    11.dual:虚表,任何用户都可以使用,表结构如下: SQL> desc dual Name Null? Type -------------------------------------- ...