|
Thank you so much sir for your kind help, I finally found a way. Thank you once again for your time sir.
|
|
|
|
|
You can when using the appropriate char types and encodings.
Use std::string<char> (std::string is a typedef for this) for ANSI and multi byte encodings like UTF-8.
Use std::string<wchar_t> (std::wstring ) for wide character Unicode strings. Note that this is platform dependant. With Windows, wchar_t is char16_t while it might be char32_t on other platforms.
|
|
|
|
|
so sir, using wide strings are the only way? some libraries takes character arrays as their arguments so can we convert these chinese fonts to character array as char* and pass as the arguments?
|
|
|
|
|
It depends on your project settings (Unicode or ANSI / multi byte), the used encoding / code page if not a Unicode project, and what the library supports. If you have a Unicode build (recommended), there is probably also a Unicode version for the library.
If the library does not use the same encoding as your project you have to convert the strings.
|
|
|
|
|
Thank you for your solution sir but the wide character is something like this,
L"F:\\dupelicateFinder\\New folder\\New folder\\检查.jpg"
so I am converting it to the string by the above method described by you,
"F:\\dupelicateFinder\\New folder\\New folder\\检查.jpg"
I've have already found a way to convert the std::string to char* using strcppy so finally I get this,
"F:\\dupelicateFinder\\New folder\\New folder\\检查.jpg"
the same thing as of string, but I have a function( from 3rd party library) which takes char* as an argument so, I have char* value as F:\\dupelicateFinder\\New folder\\New folder\\检查.jpg
but the function shows returns -1(file not found) since the unicode fonts didn't changed from 检查.jpg to 检查.jpg so how to open the file using that function
I have checked the work flow of this function using Debugger by creating the break-points and checked the values using Immediate window.
Below is my code:
template<typename duplicates>
std::string Duplicates<duplicates>::compute_hash(duplicates file_loc)
{
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::string narrow_target = converter.to_bytes(file_loc);
char *cstr = new char[narrow_target.length() + 1];
strcpy(cstr, narrow_target.c_str());
std::string hash = CALL_MD5_Function(cstr);
delete[] cstr;
std::cout << hash;
return hash;
}
|
|
|
|
|
Inside your program, the best way to represent characters is using the wchar_t-based types (e.g. std::wstring). This enables simple processing (all characters are represented by a single wchar_t value), and so on.
If you wish to call a library that only supports char-based types (e.g. std::string), you must convert whar_t types to char type, call the library, and convert the results back. In C++11, the standard way to do this is something like this:
#include <locale>
<h1>include <codecvt></h1>
<h1>include <string></h1>
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring wide_source;
std::string narrow_target = converter.to_bytes(wide_source);
std::string narrow_source;
std::wstring wide_target = converter.from_bytes(narrow_source);
If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack.
--Winston Churchill
|
|
|
|
|
Thank you for your solution sir but the wide character is something like this,
L"F:\\dupelicateFinder\\New folder\\New folder\\检查.jpg"
so I am converting it to the string by the above method described by you,
"F:\\dupelicateFinder\\New folder\\New folder\\检查.jpg"
I've have already found a way to convert the std::string to char* using strcppy so finally I get this,
"F:\\dupelicateFinder\\New folder\\New folder\\检查.jpg"
the same thing as of string, but I have a function( from 3rd party library) which takes char* as an argument so, I have char* value as F:\\dupelicateFinder\\New folder\\New folder\\检查.jpg
but the function shows returns -1(file not found) since the unicode fonts didn't changed from 检查.jpg to 检查.jpg so how to open the file using that function
I have checked the work flow of this function using Debugger by creating the break-points and checked the values using Immediate window.
Below is my code:
template<typename duplicates>
std::string Duplicates<duplicates>::compute_hash(duplicates file_loc)
{
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::string narrow_target = converter.to_bytes(file_loc);
char *cstr = new char[narrow_target.length() + 1];
strcpy(cstr, narrow_target.c_str());
std::string hash = CALL_MD5_Function(cstr);
delete[] cstr;
std::cout << hash;
return hash;
}
modified 10-Feb-17 1:57am.
|
|
|
|
|
Filenames, unfortunately, can be a problem. In order to work with multi-byte character filenames (rather than Unicode), you must convert them according to your Operating System's requirements. For Windows, this typically means using the crorrect Code Page for your system. See the WideCharToMultibyte() and the MultibyteToWideChar() APIs for details.
If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack.
--Winston Churchill
|
|
|
|
|
Sir, If I convert it according to my os requirement then we cannot guarantee it works with other os sir? Thank you
|
|
|
|
|
If you are converting filenames from Unicode to multi-byte, then you must do this according to the rules of the O/S. However, this can be encapsulated in a single class. Use conditional compilation (e.g #ifdef WINDOWS or #ifdef LINUX) to choose the correct version of the class.
If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack.
--Winston Churchill
|
|
|
|
|
Thank you sir for your kind help and time, I now understand. However I converted the some of the functions in that library to accept std::wstring which I made it easy that way
|
|
|
|
|
Thank you for your kind help sir, I have modified the function and now it is working! Thank you once again for your time!
|
|
|
|
|
class CBase {
string id;
public:
void show() {
cout << id << endl;
}
};
class CDerive1 : public CBase { };
class CDerive2 : public CBase { };
class CSon : public CDerive2, public CDerive1 { };
int main ( )
{
CSon s;
cout << &s << endl;
cout << "---------" << endl;
CDerive1 *pd1 = &s;
cout << pd1 << " &S: " << &s << endl;
CDerive2 *pd2 = &s;
cout << pd2 << " &S: " << &s << endl;
cout << "---------" << endl;
The output of this code is :
0035FB20
---------
0035FB3C
0035FB20
--------
don't know why cout << pd1, and cout << pd2 are different, they are assigned the same value &s.
|
|
|
|
|
Your output does not match the code.
|
|
|
|
|
Tested the code in QT 5.7 again, output:
0x28fe60
----------
0x28fe78
0x28fe60
--------
|
|
|
|
|
The output still does not match your code.
|
|
|
|
|
don't know why cout << pd1, and cout << pd2 are different, they are assigned the same value &s.
It is surprise of Multiple Inheritance. CSon consist of 2 blocks: CDerive2 block and CDerive1 block, each of them has own address.
[CDerive2][CDerive1] or
[ C S o n ]
Therefore address of CSon instance is equal to address of CDerive2 part of CSon, but is not equal to address of CDerive1 part of CSon.
With best wishes,
Vita
|
|
|
|
|
|
I have tried adding MFC support and calling a modal/modeless dialog from a win32 application
My program is crashing when I do this.
Deekonda Ramesh
|
|
|
|
|
Error message? Code?
The question is very less likely to be understood as it stands now.
The sh*t I complain about
It's like there ain't a cloud in the sky and it's raining out - Eminem
~! Firewall !~
|
|
|
|
|
I am having an MFC Dialog class called CDataFilesDialog
inheriting from CDialog
I have a global object of this dialog named dlg;
I am doing a dlg.DoModal() from a WMCOMMAND message handled by wndproc of my win32 application. I am trying to mix MFC and WIn32
Deekonda Ramesh
|
|
|
|
|
I strongly suspect that your entire application needs to be re-built as MFC in order to do this.
|
|
|
|
|
SInce MFC is a wrapper of win32 , why can't I do this?
Deekonda Ramesh
|
|
|
|
|
Because the design of MFC means you can use ordinary Win32 calls inside an MFC application but not the other way round.
|
|
|
|
|
Under Windows, I try to open file which name contains apostrophe or some letters in language other than English. In these cases fopen or CreateFile (from W32 library) fail to open it. How should I do that task? Wide character type, wfopen or defining UNICODE don't help. The functions say the file doesn't exist.
|
|
|
|