Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C++;_C++_Encoding - Fatal编程技术网

C++ 使用C++;

C++ 使用C++;,c++,encoding,C++,Encoding,第一部分 很明显,我缺乏关于字符编码的知识,我研究得越多,我就越发现兔子洞有多深,我希望能在这里找到古人的秘密 长话短说,我正在研究一个C++应用程序,它有几个函数,它通过使用代码< > const char */COD>作为参数的文件名。基本上,像打开文件这样的操作需要在多个循环中进行const char*。这就是说,从逻辑上讲,将参数从const char*更改为const wchar*是一个相当具有挑战性的过程,它会多次陷入死锁 我找到的大多数关于字符编码转换的文档总是假定输入是已知的。但

第一部分

很明显,我缺乏关于字符编码的知识,我研究得越多,我就越发现兔子洞有多深,我希望能在这里找到古人的秘密

长话短说,我正在研究一个C++应用程序,它有几个函数,它通过使用代码< > const char */COD>作为参数的文件名。基本上,像打开文件这样的操作需要在多个循环中进行

const char*
。这就是说,从逻辑上讲,将参数从
const char*
更改为
const wchar*
是一个相当具有挑战性的过程,它会多次陷入死锁

我找到的大多数关于字符编码转换的文档总是假定输入是已知的。但在这种情况下,该应用程序将YouTube视频标题作为文件名,它永远不知道它将得到什么……或者它真的这样做了吗

简单地说,我得到了如下结果:

wchar_t *ZStr::UTF8ToWChar(const char *in_char)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> l_converter;
    std::wstring l_path = l_converter.from_bytes(in_char);
    Int64 l_size = l_path.length() + 1;
    wchar_t *l_buffer = new wchar_t[l_size];
    wcsncpy(l_buffer, l_path.c_str(), l_size);
    return l_buffer;
}

bool ZStream::Open(const char *in_path, const char *in_mode)
{
    return m_File = _wfopen(ZStr::UTF8ToWChar(in_path), ZStr::UTF8ToWChar(in_mode));
}
wchar_t*ZStr::UTF8ToWChar(const char*in_char)
{
std::wstring_convert l_converter;
std::wstring l_path=l_converter.from_字节(在_字符中);
Int64 l_size=l_path.length()+1;
wchar_t*l_buffer=新的wchar_t[l_大小];
wcsncpy(l_缓冲区,l_路径.c_str(),l_大小);
返回l_缓冲区;
}
boolzstream::Open(常量字符*在路径中,常量字符*在路径模式中)
{
返回m_File=_wfopen(ZStr::UTF8ToWChar(在_路径中),ZStr::UTF8ToWChar(在_模式中));
}

到目前为止,它似乎适用于诸如“360°埃菲尔铁塔.mp4”或“仅使用wstring作为结果的文件名。请尝试像下面这样编辑您的函数:

std::wstring ZStr::UTF8ToWChar(const char *in_char)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> l_converter;
    return l_converter.from_bytes(in_char);
}

bool ZStream::Open(const char *in_path, const char *in_mode)
{
    return m_File = _wfopen(ZStr::UTF8ToWChar(in_path).c_str(), ZStr::UTF8ToWChar(in_mode).c_str());
}
std::wstring ZStr::UTF8ToWChar(const char*in_char)
{
std::wstring_convert l_converter;
从_字节返回l_转换器(在_字符中);
}
boolzstream::Open(常量字符*在路径中,常量字符*在路径模式中)
{
返回m_File=_wfopen(ZStr::UTF8ToWChar(在_路径中).c_str(),ZStr::UTF8ToWChar(在_模式下).c_str());
}

您使用的
UTF8ToWChar()
会导致内存泄漏,因为您没有
删除[]
新[]的内存。您确实应该返回
std::wstring
,然后使用它的
c_str()
方法如果您需要
wchar\u t*
。在任何情况下,如果您确保您的
const char*
值始终是UTF-8编码的,并且在进行平台调用时将其转换为平台编码,您将很好,并且可以移植。当您在罗马时,它有助于表现得像罗马人一样。Windows始终使用UTF-16编码。这是一个程序中的W查尔格。你当然可以忽略它,写胶水并在必要的时候应用它。但是它是忙碌的工作,你选择C++是因为你喜欢它快。做什么工作,让你快乐。你想做什么?你是给全文件路径还是文件名?试试使用完全文件路径。代码>输入值(4表示读取权限).Hello Pawel,谢谢你的输入。我确实在使用完整路径。我应该早点提到它,我的错。我使用_waccess过滤完整路径,以防止管道发生硬崩溃。你是否考虑到斜杠和/或反斜杠可能会对转换产生影响?我已经编辑了示例,以适应传递给_waccess的参数(零似乎只是存在,这是我一直使用的一个)