我正在用 C 语言编写 Adobe AIR 的 native 扩展。该代码稍后应该会移植到其他平台。 在我的 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
所以我的问题是:如何将 utf8 字符串传递给需要简单签名字符的函数? 事实上,我可以尝试在 C++ 中创建函数并将 C 部分与“extern”一起使用,但纯 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”中,我收到了各种奇怪的字母(每次都不同),例如尝试输出图像的某些部分或不正确的变量。
任何帮助将不胜感激。
最佳答案
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() 很可能有问题。
关于c++ - 在C中使用utf8字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10370314/