第一部分
我显然对字符编码缺乏了解,而且我对它的研究越多,我越发现兔子洞有多深,我希望能在这里找到古人的秘密。
长话短说,我正在开发一个C ++应用程序,它有几个函数传递使用const char*
作为参数的文件名。基本上,打开文件等操作需要在多个循环中携带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));
}
到目前为止,它似乎与文件名如“360°Eiffel Tower.mp4”或“Tropical Break.mp4”有关,但我不太确定我做得对。
我的问题是,有没有办法覆盖所有可能的操作系统文件名,并在我的应用程序中保留const char*
个参数?
注意:我的开发环境是Windows 10,但我真的很想找到一个可移植的解决方案。在最糟糕的情况下,我会选择依赖操作系统的操作系统。 (我不介意它可能需要的任何开销)。
第二部分
感谢大家的评论,非常感谢。为了使事情复杂化,我使用QT打开文件对话框返回一个QString,它似乎是一个(wchar_t *)来打开文件。 QString提供了大量的转换功能,但我仍在努力寻找适用于所有文件名的解决方案。到目前为止,Tropical Break.mp4通过_waccess返回无效:
Bool ZSystem::FileAccess(const Char *in_path, Int in_val)
{
return (_waccess(ZStr::UTF8ToWChar(in_path).c_str(), in_val) == 0);
}
bool QT_Editor::Open(const QString &in_path)
{
if (ZSystem::FileAccess(in_path.toUtf8().constData(), 0)) /// constData() = const char*
{
///...
}
}
我尝试了几种组合而没有成功。我意识到这不是很有效但是我很久以前就已经做出了很多选择。我甚至不确定是什么类型,但它的完整性似乎在循环中丢失了。任何见解都会受到欢迎。
答案 0 :(得分:1)
仅使用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());
}