Solved Use maxon::StringDecodings::Utf8()

std::string SceneParser::GetIDString(BaseList2D* node){
Int memsize=0;
const Char* mem;
node->FindUniqueID(MAXON_CREATOR_ID, mem,  memsize);
String ID_STR;
ID_STR.SetCString(mem,memsize);
std::string result=StringToStdString(ID_STR);
return result;

}

Hello. I have this function but when I try the debugger it breaks showing this

 DebugStop("Undefined encoding. Use maxon::StringDecodings::Utf8()");

The Debugger Stops in this line "ID_STR.SetCString(mem,memsize);" which is a function of c4d_string.h from the framework.
I understand what the error is but I am not finding the proper way to use "maxon::StringDecodings::Utf8()" so the function will work properly later. Is there any way I can fix this problem.
Thank you in advance!

Hi Ogers, thanks for reaching us.

With regard to your request, it's enough to pass the STRINGENCODING::UTF8 but I warmly suggest you to move from old string and use the maxon::String since the old implemetation just relies on the maxon::StringInterface::SetCString() method.

Last but not least consider that you can initialize both a String or maxon::String directly by passing a Char* (see respectively here and here)

For the sake of completeness, please find below a short snippet showing how to properly use SetCString()

#include "maxon/stringencoding.h"

maxon::Result<void> TestOnCString(BaseDocument *doc)
{
	iferr_scope;
	
	if (!doc)
		return maxon::IllegalArgumentError(MAXON_SOURCE_LOCATION);
	
	Int memsize = 0;
	const Char* mem;
	
	// try to find something meaningful
	if (doc->FindUniqueID(MAXON_CREATOR_ID, mem,  memsize))
	{
		String c4dStr;
		c4dStr.SetCString(mem, memsize, STRINGENCODING::UTF8);
		DiagnosticOutput("c4dStr: @", maxon::String(c4dStr));
	}

	// add a more meaningful string
	const Int mysize = 5;
	const Char chars[mysize] = "MyID";
	const Int myID = 12345;
	doc->AddUniqueID(myID, chars, mysize);
	if (doc->FindUniqueID(012345, mem,  memsize))
	{
		maxon::String maxonStr;
		const maxon::StringDecodingRef& stringDecoding = maxon::StringDecodings::Utf8();
		maxonStr.SetCString(mem, memsize, stringDecoding) iferr_return;
		DiagnosticOutput("maxonStr: @", maxonStr);
	}
	
	return maxon::OK;

}

Best, Riccardo

Hi Ogers, thanks for reaching us.

With regard to your request, it's enough to pass the STRINGENCODING::UTF8 but I warmly suggest you to move from old string and use the maxon::String since the old implemetation just relies on the maxon::StringInterface::SetCString() method.

Last but not least consider that you can initialize both a String or maxon::String directly by passing a Char* (see respectively here and here)

For the sake of completeness, please find below a short snippet showing how to properly use SetCString()

#include "maxon/stringencoding.h"

maxon::Result<void> TestOnCString(BaseDocument *doc)
{
	iferr_scope;
	
	if (!doc)
		return maxon::IllegalArgumentError(MAXON_SOURCE_LOCATION);
	
	Int memsize = 0;
	const Char* mem;
	
	// try to find something meaningful
	if (doc->FindUniqueID(MAXON_CREATOR_ID, mem,  memsize))
	{
		String c4dStr;
		c4dStr.SetCString(mem, memsize, STRINGENCODING::UTF8);
		DiagnosticOutput("c4dStr: @", maxon::String(c4dStr));
	}

	// add a more meaningful string
	const Int mysize = 5;
	const Char chars[mysize] = "MyID";
	const Int myID = 12345;
	doc->AddUniqueID(myID, chars, mysize);
	if (doc->FindUniqueID(012345, mem,  memsize))
	{
		maxon::String maxonStr;
		const maxon::StringDecodingRef& stringDecoding = maxon::StringDecodings::Utf8();
		maxonStr.SetCString(mem, memsize, stringDecoding) iferr_return;
		DiagnosticOutput("maxonStr: @", maxonStr);
	}
	
	return maxon::OK;

}

Best, Riccardo

@r_gigante Thank you for your help. I used the maxon::String and it works fine.