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

C++ 在C中使用utf8字符串,c++,c,string,utf-8,air,C++,C,String,Utf 8,Air,我正在用C编写AdobeAIR的本机扩展。代码应该稍后移植到其他平台。 在C端的函数中,我从空中得到一个字符串,如下所示 uint32_t len; const uint8_t*str=0; if(FRE_OK==FREGetObjectAsUTF8(argv[0]、&len、&str)) { //这里我需要将一个字符串作为参数传递给其他函数 printf(“获取字符串%s”,str);//显示奇怪的字母而不是str } FREGetObjectAsUTF8返回UTF8编码的字符串,该字符串应

我正在用C编写AdobeAIR的本机扩展。代码应该稍后移植到其他平台。 在C端的函数中,我从空中得到一个字符串,如下所示

uint32_t len;
const uint8_t*str=0;
if(FRE_OK==FREGetObjectAsUTF8(argv[0]、&len、&str))
{
//这里我需要将一个字符串作为参数传递给其他函数
printf(“获取字符串%s”,str);//显示奇怪的字母而不是str
}
FREGetObjectAsUTF8返回UTF8编码的字符串,该字符串应表示为const uint8\u t。我在MacOS和XCode中工作,uint8_t被定义为无符号字符。问题在于一堆c代码需要一个简单的char*作为参数。我不需要任何来自unicode的字母,我只使用拉丁字母和数字

我试着在没有运气的情况下铸造一种类型。举例来说

char缓冲区[512];
sprintf(缓冲区,“%s”,(char*)str)//同样奇怪的字母
但若我迭代字符串,我得到的是正确的值

(i=0;i)的

如何将utf8字符串传递给需要简单有符号字符的函数

有两种方法:

  • 只需将其强制转换为const char*。utf8字符串是“兼容的”使用const char字符串,在某种意义上,只有ASCII的C字符串将是只包含ASCII字符的UTF8字符串,而具有非ASCII字符的UTF8字符串将不包含中间的零。但是,如果使用此方法,任何不属于ASCII的字符将变成不可读的序列。当然,如果C函数。ion需要类似文件路径的东西来打开文件,但这不起作用
  • 使用特定于操作系统的文本函数,这些函数允许您更改代码页,并将utf8字符串重新编码为系统正在使用的任何8位代码页。但是,使用此方法,不属于系统代码页的字符将“丢失”-它们将变为一些“默认”字符,如“?”或“正方形中的问号”.比如说“研究片仮名" will becmoe“研究???”。或者,代替操作系统功能,您可以尝试使用类似的功能,但这不会解决“字符不在代码页中”的问题

  • 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);
    }
    

    executeCommand()很可能有问题.

    你确定代码示例真的代表了你的代码吗?sprintf
    看起来不错。但是,你说有效的printf不可能有效-你给它一个字符,然后使用
    %s
    ,它应该崩溃,UTF-8或不是。为什么首先使用uint8\u t?不管怎样,你会得到什么奇怪的字母?你说“我不需要Unicode,我只使用拉丁语",但拉丁语是Unicode的一部分,所以你已经在使用它了!UTF8字符串来自于FREGetObjectAsUTF8功能,它是air框架的一部分。是的,我知道拉丁语是Unicode的一部分。奇怪的字母,比如从内存中打印一些垃圾,除非我弄错了,在你调用FREGetObjectAsUTF8之后,
    str
    指向co下的缓冲区控制Flash。最好在调用后立即将结果复制到您自己的字符串中,然后再继续。是的,您是对的。我尝试使用sprintf或strncpy,但每次都有一个垃圾而不是我的值。我更新了问题。感谢您的回答。我在代码中只使用ASCII字符,我知道什么utf8字符串与c兼容har但简单的类型转换到char不会给我任何结果。这很奇怪。谢谢你的回答。我同意我应该得到正确的结果,但我没有。事实上,我得到的是一些奇怪的字母而不是字符串。这就像试图从内存中输出一些垃圾。但变量初始化正确,长度正确。@icewind post m详细说明您看到的文本输出以及字符串由哪些数值组成。
    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);
    }
    
    if( FRE_OK == FREGetObjectAsUTF8(argv[0], &len, &str) ) {
        executeCommand( (const char*)str );
    
        FREObject result;
        FRENewObjectFromUTF8(len, str, &result);
    }