c++ - 在C中使用utf8字符串

标签 c++ c string utf-8 air

我正在用 C 语言编写 Adob​​e 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/

相关文章:

ios - 我怎样才能插入一个字符串的二维数组

c - strstr() 函数类似,忽略大写或小写

c++ - 在 boost 的 multi_index_container 中获取不等于 x 的值

c++ - 字符串->结构CMap

c - 嵌入式系统中的事件记录

c - 如何自动向结构中的字节添加填充以修复 C 中的寄存器对齐?

c++ - 类似于 C++ 的并行 Python?

c++ - 方法返回基类而不是派生类 C++

c++ - 区域设置和编码(终端)有什么区别

JavaScript String.split 在字符串文字上生成数组