2

我正在用 C 编写 Adob​​e 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 被定义为无符号字符。问题出在一堆 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++ 中创建函数并将 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”中,我得到了各种奇怪的字母(每次都不一样),比如试图输出图像的某些部分或不正确的变量。

任何帮助将不胜感激。

4

2 回答 2

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() 很可能有问题。

于 2012-04-29T07:29:39.190 回答
1

我如何将 utf8 字符串传递给需要简单签名字符的函数?

有两种方法:

  1. 只需将其转换为 const char*。utf8 字符串与 const char 字符串“兼容”,因为仅 ascii 的 C 字符串将与仅包含 Ascii 字符的相同 utf8 字符串,而具有非 ascii 字符的 utf8 字符串中间不包含零。但是,如果使用这种方法,任何不属于 ASCII 的字符都将变成不可读的字符序列。当然,如果 C 函数需要类似文件路径来打开文件,这将不起作用。
  2. 使用特定于操作系统的文本函数,这些函数允许您更改代码页并将 utf8 字符串重新编码为系统正在使用的任何 8 位代码页。但是,通过使用这种方法,不属于系统代码页的字符将“丢失”——它们将变成一些“默认”字符,如“?” 或“正方形的问号”。所以像“学片仮名”这样的东西会变成“学???”。或者,您可以尝试使用libiconv之类的东西,而不是 OS 功能,但这不会解决“字符不在代码页中”的问题。
于 2012-04-29T07:22:33.353 回答