我正在用C语言编写Adobe AIR的原生扩展。稍后应将代码移植到其他平台。 在C方面的我的功能中,我从这样的空气中得到了一个字符串
uint32_t len;
const uint8_t * str = 0;
if( FRE_OK == FREGetObjectAsUTF8(argv[0], &len, &str) )
{
//Here i need to pass a string as an argument to other function
printf("Got string %s", str); //Showing weird letters instead of str
}
FREGetObjectAsUTF8返回UTF8编码的字符串,该字符串应表示为const uint8_t。我在MacOS和XCode中工作,uint8_t被定义为unsigned char。问题在于一堆c代码,它需要一个简单的char *作为参数。我不需要任何来自unicode的信件,而且我只使用拉丁字母和数字。
我试图投下一个没有运气的类型。例如
char buffer[512];
sprintf(buffer, "%s", (char*)str); //Same weird letters here
但如果我迭代字符串我得到正确的值
for(i=0; i<len; i++)
printf("%s", str[i]); // Normal value
所以mu问题是:我如何将utf8字符串传递给需要简单签名字符的函数? 事实上,我可以尝试用c ++创建函数,并使用带有“extern”的C部分,但更优选纯C解决方案。
我从空中传递字符串“initapp”,如果我将其返回运行时它会显示正确的值“initapp”。在我的C代码中,我试图在函数中传递它,期望char *作为参数
FREObject initApp(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
{
uint32_t len;
const uint8_t * str = 0;
if( FRE_OK == FREGetObjectAsUTF8(argv[0], &len, &str) )
{
/*
I have about 40 functions and most of them working with ASCII strings
*/
executeCommand( (const char*)str );
FREObject result;
FRENewObjectFromUTF8(len, str, &result);
return result; //It's ok. Correct string
}
return NULL;
}
但是在我的函数而不是“initapp”中我得到了各种奇怪的字母(每次不同),比如试图输出图像的某些部分或不正确的变量。
任何帮助都将受到高度赞赏。
答案 0 :(得分:2)
Mac OS X通常希望简单的char *字符串为UTF-8,因此您应该使用所显示的代码获得正确的结果。
sprintf(buffer, "%s", (char*)str);
如果以下代码打印出表示有效UTF-8字符串的数值:
if( FRE_OK == FREGetObjectAsUTF8(argv[0], &len, &str) ) {
for(int i=0; i<len; ++i)
printf("0x%02X ", str[i]);
FREObject result;
FRENewObjectFromUTF8(len, str, &result);
}
用调用自己的函数替换printf循环导致垃圾:
if( FRE_OK == FREGetObjectAsUTF8(argv[0], &len, &str) ) {
executeCommand( (const char*)str );
FREObject result;
FRENewObjectFromUTF8(len, str, &result);
}
executeCommand()很可能存在问题。
答案 1 :(得分:1)
我如何将utf8字符串传递给需要简单签名字符的函数?
两种方法: