使用C ++

时间:2018-03-16 04:12:03

标签: c++ encoding

第一部分

我显然对字符编码缺乏了解,而且我对它的研究越多,我越发现兔子洞有多深,我希望能在这里找到古人的秘密。

长话短说,我正在开发一个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*
    {
        ///...
    }
}

我尝试了几种组合而没有成功。我意识到这不是很有效但是我很久以前就已经做出了很多选择。我甚至不确定是什么类型,但它的完整性似乎在循环中丢失了。任何见解都会受到欢迎。

1 个答案:

答案 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());
}