[英]Multibyte characters and u8 strings in C
我覺得完全掌握u8
字符串的使用有點困難。 我知道它們是 UTF-8 編碼的字符串,但我的測試結果似乎指向了另一個方向。 我在 Linux 上使用 gcc 7.5。 這是我的測試代碼:
#include <stdio.h>
#include <string.h>
int main()
{
char a[] = u8"gå";
int l = strlen(a);
for(int i=0; i<l; i++)
printf("%c - %d - %ld\n", a[i], (unsigned char)a[i], sizeof(a[i]));
printf("%d: %s\n", l, a);
return 0;
}
運行后,我得到這個:
g - 103 - 1
� - 195 - 1
� - 165 - 1
3: gå
這是有道理的:它使用 2 個字節對å
進行編碼,使用 1 個字節對g
進行編碼,總共 3 個字節。
然后我刪除了u8
前綴,我得到了相同的結果。 根據標准,我可能認為 gcc 實際上默認使用 UTF-8 對字符串進行編碼。 到目前為止,一切都很好。
但現在我嘗試了其他方法:我再次恢復u8
前綴,並將源文件的編碼更改為 ISO-8859。 我明白了:
g - 103 - 1
� - 229 - 1
2: g�
不僅編碼改變了(它不應該改變,因為它是一個u8
字符串),而且字符串打印不正確。 如果我再次刪除前綴,我會再次得到最后一個結果。
就像忽略u8
前綴一樣,編碼由源文件文本編碼決定。
所以我的兩個問題是:
u8
前綴不做任何事情? u8
僅確保二進制文件中的字符串是 UTF-8 編碼的,無論執行字符集如何。 如果您以 UTF-8 為目標,那就太麻煩了。
當您告訴編譯器使用的源字符集與文件的編碼不匹配時,就會出現問題。 如果它們確實匹配,並且在保存文件時字符串被正確重新編碼,並且您使用u8
,那么在這兩種情況下您都不會看到 output 有任何差異。 如果您不使用u8
,則結果取決於執行字符集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.