2016-07-16 5 views
0

すべて私はWinformを書くためにC++/CLIを使用しています。私のオペレーティングシステムの言語は中国語です。私はopenfiledialogからSystem :: Stringを取得し、.NETでSystem :: StringをUTF8エンコーディングに変換し、最後にStringToHGlobalAnsiを使用してstd :: stringに変換します。私は中国の名前のビデオを開き、ffmpegのにそれを養う場合.NET System :: std :: stringへの文字列

しかし、ffmpegのは正しくビデオを開くことができます。しかし、私が韓国に映像を公開すると、ffmepgは映像を開くことができません。オペレーティングシステムの言語とは異なる別の言語のビデオを開く方法を知っている人はいますか?

+1

Windowsでは、UTF-8はUTF-16を内部的に使用しているため、「W」(ワイド・チャーブル)を使用する必要があります。 )Win32の関数ではなく、 'A'(ASCII)のものです。したがって、Windowsでは 'std :: wstring'を*使用するべきでしょう。 'msclr :: interop :: marshal_as (theSystemString)'のような適切なマーシャリング関数を使うべきです。しかし、とにかく、あなたが[mcve]を提供し、*「正しく開く」*が意味することを説明しないかぎり、あなたはここでもう助けを得ることはありません。 –

+0

ここに問題があります:ffmpegが受け入れる/期待するファイル名文字列の種類 – Medinoc

+0

私の中国語オペレーティングシステムでは、ffmpegはさまざまな言語(日本、韓国...)のファイル名を受け入れることができると期待しています.ffmegを入力する前に、このファイル名System :: Stringで何をすればよいですか。 –

答えて

0

ありがとう! 私はルーカスの提案に従っています。ここに別の言語のビデオファイル名を開くことができるコードです。

私のネイティブのDLL API:C++/CLIで

OpenVideo(char* video_path); 

マイコード:

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

は、私はあなたがリソースを管理するより少ない手間を有し、これを使用したほうが良いだろうと思うし、

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)); 
関連する問題