2017-04-20 39 views
0

舊問題:How SubString,Limit Using C?,但沒有人沒有回答我的問題。如何從字符串使用C獲取Utf-8字符?

我想從一個字符串中獲得一個索引。

我的字符串可能包含符號和UTF-8字符(如:ß)。字符串我

速度是很重要的。

1#:w_char_t數據類型適合我?

2#:如何從utf-8字符串獲取字符?

#include <stdio.h> 
#include <stdlib.h> 
#include <wchar.h> 
#include <string.h> 

int main() 
{ 
wchar_t *msg1 = L"ßC Programming"; 
//wprintf(L" vals> %Ls\n",msg1); 
//wprintf(L" vals> %s\n",msg1); 
printf(" vals> %Ls %S\n",msg1,msg1);//dont show any=====>BUG 
printf(" val> %Lc\n",msg1[1]);//show `C` 
printf(" val> %Lc\n",msg1[0]);//dont show any=====>BUG 
printf("\n"); 
///////////////////////////////// 
char *msg2 = "ßC Programming"; 
printf(" vals> %s\n",msg2);//show `ßC Programming` 
printf(" val> %c\n",msg2[1]);//show `�`=====>BUG 
printf(" val> %c\n",msg2[0]);//show `�`=====>BUG 
printf("\n"); 
} 

請指導我解決問題。

回答

1

wchar_t可以是一個選項。不過,你應該知道它使用的編碼。如果它是16位寬,則使用utf-16(通用,但不能保證),並且您使用的編碼點等於或高於0x10000(U + 10000),則您再次遇到同樣的問題...

I儘管如此,個人寧願保持正常字符。

問題是現在,如何檢測多字節字符。你可以通過查看最重要的位來發現它們:如果沒有設置,你有一個正常的字符(ASCII兼容...),如果它被設置,該字節是多字節字符的一部分。

如果第二個MSB也被設置,它也是一個多字節序列的起始字節,如果它沒有設置,它是一個後續字節。

一個格式UTF-8的多字節序列的如下:

第一字節:N最顯著位被設置爲1指定整個序列多少字節包含,接着是零位。剩餘位是你的unicode代碼點的最重要的位。

每個後續字節都有10位作爲最高有效位,其餘6位是您的代碼點的下一個最高有效位。

示例字母'ß':它具有unicode代碼點0xdf,二進制0b11011111。

需要8位,不配合,將7的單字節字符,所以我們需要把它分解:

11 + 011111 

我們總共需要兩個字節,所以我們需要添加字節頭11010;然後第一個字節必須填寫了零:

110 000 11 + 10 011111 

所以,你得到的字節序列0b11000011,0b10011111(十六進制:0xc3,0x9f)。

雖然圖書館有這方面的幫助。例如,您可能對ICU感興趣。

+0

ICU是C的圖書館嗎? – GoWorkCode

+0

@GoWorkCode引用他們的網站:「ICU是一套成熟的,廣泛使用的C/C++和Java庫,爲軟件應用程序提供Unicode和全球化支持。「 – Aconcagua

+0

raspberry pi微控制器和Windows支持? – GoWorkCode

相關問題