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的参数(零似乎只是存在,这是我一直使用的一个)