随笔-4  评论-40  文章-117  trackbacks-0


   今天使用在使用ifstream和ofstream创建文件和读取文件时,发现在中文路径下一直失败,而在英文路径下则一切OK。
   后来一查,原来是fstream的问题,微软在实现ifstream的open方法时,调用了mbstowcs_s先进行文件名转换,但mbstowcs_s依赖于当前的locale的CTYPE设置,默认CTYPE为C,也就是假定所有的字符都只有一个字节长,微软对这种情况下进行了特殊的转换处理:
                        /*   C   locale:   easy   and   fast   */
                        while   (count   <   n)
                        {
                                *pwcs   =   (wchar_t)   ((unsigned   char)s[count]);
                                if   (!s[count])
                                        return   count;
                                count++;
                                pwcs++;
                        }

否则使用的是MultiByteToWideChar进行转换。所以有中文等多字节字符时就出错了。

  解决办法:

1、使用C语言的函数设置为中文运行环境
setlocale(LC_ALL,"Chinese-simplified");

2、使用STL函数设置为系统语言环境
std::locale::global(std::locale(""));
但是据说这样之后cout又不能输出中文了。

3. 传入 Unicode 字符串.

wchar_t path[MAX_PATH];
 MultiByteToWideChar(CP_ACP, 0, FilePath, (int)(strlen(FilePath)+1), path, MAX_PATH);

 std::ifstream ifs;
 ifs.open(wchar_path);

注:传入strlen(FilePath)+1,是为了将结束标识 '\0' 也转化成 宽字符。


posted on 2007-12-11 22:50 李阳 阅读(1505) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理