2012-04-29 120 views
2

我正在使用C編寫Adobe AIR的本機擴展。稍後應將代碼移植到其他平臺。 在我的C面功能我是從空氣中得到一個字符串這樣在C中使用utf8字符串

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返回應表示爲const uint8_t一個UTF8編碼的字符串。我在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」我越來越怪異的各種字母(每次都不同),喜歡嘗試輸出圖像的一部分或不正確的變量。

任何幫助將不勝感激。

+1

你確定代碼示例真的代表你的代碼嗎? 'sprintf'似乎很好。然而,你所說的'printf'不可能工作 - 你給它一個單獨的字符並使用'%s',它應該會崩潰,UTF-8或不。 – ugoren 2012-04-29 07:30:37

+0

爲什麼首先使用uint8_t?無論如何,你會得到什麼奇怪的信件?而你說「我不需要Unicode,我只使用拉丁文」,但拉丁文是Unicode的一部分,所以你已經在使用它了! – 2012-04-29 07:30:52

+0

UTF8字符串來自FREGetObjectAsUTF8作爲空氣框架的一部分。是的,我知道拉丁語是unicode的一部分。奇怪的字母像打印內存中的垃圾 – 2012-04-29 07:38:57

回答

1

我怎樣才能傳遞一個utf8字符串到一個函數,期望一個簡單的簽名字符?

兩種方式做到這一點:

  1. 它只是扔在爲const char *。 utf8字符串與const char字符串「兼容」,因爲ascii-only C字符串將是相同的utf8只包含Ascii字符的字符串,utf8-string與非ascii字符在中間不包含零。但是,如果使用此方法,則任何不屬於ASCII一部分的字符都將變爲不可讀的字符序列。當然,如果C函數期望像文件路徑那樣打開文件,這將不起作用。
  2. 使用操作系統特定的文本函數,可以更改代碼頁並將utf8字符串重新編碼爲系統正在使用的任何8位代碼頁。但是,通過使用這種方法,不屬於系統代碼頁的字符將會「丟失」 - 它們會變成一些「默認」字符,如'?'。或「廣場上的問號」。所以像「研究片仮名」這樣的東西將成爲「研究???」。或者,您可以嘗試使用類似libiconv之類的代替OS功能的代碼,但這不會修復「不在代碼頁中的字符」問題。
+0

感謝您的回答。我在我的代碼中只使用ASCII字符,我知道什麼utf8字符串與char兼容,但簡單的類型轉換爲字符給我沒有結果。這很奇怪。 – 2012-04-29 07:31:52

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()的一個問題。

+0

感謝您的回答。我同意我應該得到正確的結果,但我不知道。事實上,我得到了一些奇怪的字母,而不是我的字符串。這就像試圖從內存中輸出一些垃圾。但變量正確初始化並且長度正確。 – 2012-04-29 07:36:01

+0

@icewind發佈更多關於您看到的文本輸出的詳細信息以及該字符串包含的數字值。 – bames53 2012-04-29 07:39:17

+0

我已更新我的問題 – 2012-04-29 07:52:15