如何打开包含unicode字符的路径或文件名的文件,并在不使用任何特殊API的情况下读取或写入其内容?如果可能的话,如何只使用std库或只使用windows?我确实尝试了std::wifstream来打开一个文件,如下面的代码示例所示,但是它没有编译。看起来它不需要“const wchar_t*”参数,而是“const*”。我使用的是TDM-GCC 4.7.1编译器,它包含在Dev-C++ IDE中.
#ifndef UNICODE
#define UNICODE
#endif
...
#include <clocale>
#include <windows.h>
#include <fstream>
...
int main(int argc, char **argv)
{
setlocale(LC_ALL, "Polish_Poland.852") ;
...
fileCompare(first, second) ;
...
}
...
bool fileCompare(wstring first, wstring second) // This function doesn't compile !
{
using namespace std ;
wifstream fin0(first.c_str(), ios::binary) ;
wifstream fin1(second.c_str(), ios::binary) ;
...
}一些完整的例子:
#ifndef UNICODE
#define UNICODE
#endif
#include <clocale>
#include <conio.h>
#include <windows.h>
#include <fstream>
#include <string>
#include <iostream>
using namespace std ;
bool fileCompare(wstring first, wstring second) ;
int main(int argc, char **argv)
{
setlocale(LC_ALL, "Polish_Poland.852") ;
wstring first, second ;
first = L"C:\\A.dat" ;
second = L"C:\\E.dat" ;
fileCompare(first, second) ;
getch() ;
return 0 ;
}
bool fileCompare(wstring first, wstring second) // This function doesn't compile !
{
wifstream fin0(first.c_str(), ios::binary) ;
wifstream fin1(second.c_str(), ios::binary) ;
}另外,当我将L"C:\A.dat“和L"C:\E.dat”替换为包含波兰字符的字符串时,它会输出一个关于非法字节序列的错误。
发布于 2014-11-02 14:28:35
wifstream不处理文件名编码问题。据我所知,wifstream和ifstream的文件名都是基于char的,而不是基于wchar_t的。您必须在操作系统使用的字符编码中提供文件名,例如latin1、utf8等。
但是,wifstream使您能够读取wchar_t流。您可以告诉流,通过将注入到流中,您期望得到什么输入:
例如:
// We expect the file to be UTF8 encoded
std::locale locale("en_US.utf8");
fin0.imbue(locale);编辑:如果您需要将您的文件名(或任何字符串)从wchar_t转换为适当的char编码,您可能会深入研究区域设置的codecvt facets主题。
// Method translates wchar_t => pl_PL.iso88592" encoding
std::string to_string(const std::wstring & wstr)
{
typedef std::codecvt< wchar_t, char, std::mbstate_t > ccvt_t;
std::locale loc("pl_PL.iso88592");
const ccvt_t & facet = std::use_facet<ccvt_t>( loc );
std::string s;
{
std::mbstate_t st=mbstate_t();
const wchar_t *wac = wstr.c_str();
const wchar_t *wou = wac + wstr.length();
const wchar_t *wnx = wac;
ccvt_t::result r = ccvt_t::ok;
while(wou!=wnx && (r==ccvt_t::ok || r==ccvt_t::partial))
{
static const int l = 100;
static char cou[l];
char *cnx=NULL;
r = facet.out(st,wac,wou,wnx,cou,cou+l,cnx);
s+=std::string(cou,cnx-cou);
wac=wnx;
}
}
return s;
} 支持什么类型的std::locale,以及如何指定它可能依赖于操作系统。
https://stackoverflow.com/questions/26700115
复制相似问题