繁体XP下,如何读取那些简体文件名的文件,因为文件名中有乱码,所以没法读,那些简体文件名用哪种编码方式呢
相应的简体XP下,就没有这种问题,繁体和简体文件名的文件,都可以读出来,文件名不会显示乱码

解决方案 »

  1.   

    用的是不同的code page,繁体用的是BIG5(CP950),简体中文是GBK(CP936),由于GBK包含了全部的GB2312/Big5/JIS的内码,所以使用936的Codepage也可以显示Big5的文件名。如果繁体系统上找不到CP936,也就没法显示简体中文的路径了。
      

  2.   

    过去遇到过这个问题,貌似操作系统是以ANSI方式存贮的文件夹名.因为有个程序以UTF-8方式显示数据,而文件假名是要求显示的数据之一,当时的解决办法是把UTF-8格式的期望字符串code直接强转类型为ansi,(其实还是UTF8数据)
    然后CreateDirectory
      

  3.   


    正像楼上解释的那样,简体系统里面的GBK可以正确显示繁体和简体字符.但是如果说繁体系统只有BIG5,那它自己怎么显示那些简体字符的呢,比较奇怪
    猜测,是不是因为繁体系统默认用BIG5,而没有调用GBK呀,需要自己强制指定下?
      

  4.   

    自己显示那些检体字符应该就是用cp950意外的代码页翻译出来的,现在问题是文件系统里的名字编码是用的cp950但实际名字是非cp950存储的吧?那么读出来用API转换一下内码看看如何?希望楼主能举个实际例子,到底读出来的是什么样子
      

  5.   

    简单说来,如果在繁体系统下,有一个文件名是“中国.txt”,通过WIN32_FIND_DATA找到这个文件,此时WIN32_FIND_DATA结构中的文件名就是乱码。
      

  6.   

    就是这个意思,那么转玛.
    最好把这个中国.txt的乱吗发上来
      

  7.   

    快下班了~楼主来了之后可以考虑用下买面这个函数把字符串转成utf-8看看void ConvertGBKToUtf8(CString& strGBK) {
    int len=MultiByteToWideChar(936, 0, (LPCTSTR)strGBK, -1, NULL,0);
    unsigned short * wszUtf8 = new unsigned short[len+1];
    memset(wszUtf8, 0, len * 2 + 2);
    MultiByteToWideChar(936, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);
    len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
    char *szUtf8=new char[len + 1];
    memset(szUtf8, 0, len + 1);
    WideCharToMultiByte (936, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);
    strGBK = szUtf8;
    delete[] szUtf8;
    delete[] wszUtf8;
    }
      

  8.   


    就像网页一样,在每个文件头放置一个CodePage ,比如本网页的<meta http-equiv="Content-Language" content="zh-CN">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    涉及到 CodePage 问题,所以很麻烦,如果使用Unicode就没这个问题了P.S.在VC里处理这种 Localize 问题,是先准备每种CodePage的Resource,然后根据用户的CodePage 选择相应的界面,所以VC 的资源编辑器里每种资源都有选择国家的下拉框选项
      

  9.   

    我写的程序,要在各种操作系统下使用
    所以你要我如何Localize呢
      

  10.   

    的确你要写的在各种操作系统下使用,但是作为事实上已存在的检体文件名本身他的编码只由创建时决定吧?指定CODEPAGE936强转为宽字符或utf-8应该可以实现兼容
      

  11.   


    MSDN 搜索 Keywords: Localize另附:这不是简单的问题,没有专业的团队会很吃力简单处理就是判断用户的使用环境,如果允许则执行,如果不允许,则用当地的编码方式显示一段错误信息,然后退出
      

  12.   

    Codepage是相对于windows中非unicode的ANSI程序的,因为windows内核(NT之后)采用的是unicode编码,这些Codepage是指导windows系统将ANSI程序的非unicode的编码转化成unicode编码用的。
    如果你的程序是ANSI编码的,系统就会根据当前的Codepage来转换编码,如果Codepage不匹配就会出现乱码。就比如说你的字符串是GBK(CP936)编码的,而繁体系统的默认Codepage是BIG5(CP950),这样一转就乱码了。GetACP()可以得到当前系统的ANSI codepage。
    也可以直接到"Control Panel"-->"Date,Time,Language,and Regional Options"-->"Reginal and Language Options"-->"Advanced"查看。解决方法:
    1.把你的程序改成用Unicode编码,如果你的工程不大的话,这个比较可取(基本上做到i18n ready,然后做l10n就方便了)
    2.调用Windows API传入GBK编码的中文字符串参数时,先按Codepage转化为Unicode编码,使用CP936的Codepage参数调用MultiByteToWideChar;软后调用相应的Unicode版的API。显示GBK编码的中文字符串时也要将其转化为unicode然后调用unicode版的显示输出函数。