在C中使用utf8字符串

时间:2012-04-29 06:53:10

标签: c++ c string utf-8 air

我正在用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”中我得到了各种奇怪的字母(每次不同),比如试图输出图像的某些部分或不正确的变量。

任何帮助都将受到高度赞赏。

2 个答案:

答案 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字符串传递给需要简单签名字符的函数?

两种方法:

  1. 只需将其转换为const char *即可。 utf8字符串与const char字符串“兼容”,因为ascii-only C字符串将是仅包含Ascii字符的utf8字符串,而具有非ascii字符的utf8字符串将不包含中间的零。但是,如果使用此方法,则任何不属于ASCII的字符都将变为不可读的字符序列。当然,如果C函数需要像文件路径那样打开文件,这将无法正常工作。
  2. 使用特定于操作系统的文本函数,允许您更改代码页并将utf8-string重新编码为系统正在使用的任何8位代码页。但是,通过使用此方法,不属于系统代码页的字符将“丢失” - 它们将变为某些“默认”字符,如“?”或“广场上的问号”。所以像“研究片仮名”之类的东西将会“研究???”。或者,您可以尝试使用类似libiconv的内容而不是OS功能,但这不会修复“不在代码页中的字符”问题。