簡體   English   中英

C 中的多字節字符和 u8 字符串

[英]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前綴一樣,編碼由源文件文本編碼決定。

所以我的兩個問題是:

  1. 為什么u8前綴不做任何事情?
  2. 當我將源代碼編碼為 ISO-8859 時,為什么字符串打印不好?

u8僅確保二進制文件中的字符串是 UTF-8 編碼的,無論執行字符集如何。 如果您以 UTF-8 為目標,那就太麻煩了。

當您告訴編譯器使用的源字符集與文件的編碼不匹配時,就會出現問題。 如果它們確實匹配,並且在保存文件時字符串被正確重新編碼,並且您使用u8 ,那么在這兩種情況下您都不會看到 output 有任何差異。 如果您不使用u8 ,則結果取決於執行字符集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM