2016-07-16 81 views
0

所有,我用C++/CLI编写Winform。我的操作系统语言是中文。我从openfiledialog获得System :: String,并使用.NET将System :: String转换为UTF8编码,最后我使用StringToHGlobalAnsi将它转换为std :: string。.NET系统::字符串到std ::字符串

但是,如果我打开中文命名的视频,并将其提供给ffmpeg,则ffmpeg可以正确打开视频。但是当我打开韩国的视频时,ffmepg无法打开视频。有人知道如何打开不同于操作系统语言的不同语言的视频吗?

+1

Windows使用UTF-16内部,而不是UTF-8,而应该叫'W'(宽字符)Win32函数而不是'A'(ASCII)函数。因此,你应该*在Windows上使用'std :: wstring'。你应该使用适当的封送处理函数,例如'msclr :: interop :: marshal_as (theSystemString)'。但无论如何,除非你提供[mcve]并解释*“正确打开”*的含义,否则在这里你不会得到任何帮助。 –

+0

这里的问题是:ffmpeg接受/期望什么类型的文件名字符串? – Medinoc

+0

我希望在我的中文操作系统中,ffmpeg可以接受各种语言(日本,韩国......)文件名。在输入ffmeg之前,我应该如何处理这个文件名System :: String。 –

回答

0

谢谢各位! 我遵循卢卡斯的建议。这里是可以打开不同语言视频文件名的代码。

我本地的dll API:

OpenVideo(char* video_path); 

我的代码在C++/CLI:

System::String^ multi_language_str = str_from_openfile_dialog; 

const wchar_t* wstr_file_name = (const wchar_t*)(Marshal::StringToHGlobalUni(multi_language_str)).ToPointer(); 

std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter; 

std::string str_file_name = converter.to_bytes(wstr_file_name); 

OpenVideo(str_file_name.c_str()); 

Marshal::FreeHGlobal((IntPtr)(void*)wstr_file_name); 
0

我想你会更好使用这一点,它具有管理资源少些麻烦,并更是异常安全的感谢pin_ptr的析构函数:

array<unsigned char>^ bytes = System::Text::Encoding::UTF8::GetBytes(str_from_openfile_dialog + L'\0'); 
cli::pin_ptr<unsigned char> pinned = &bytes[0]; 
const unsigned char * puString = pinned; 

OpenVideo(static_cast<const char *>(puString));