[英]char vs wchar_t
我正在嘗試打印出一個wchar_t *字符串。 代碼如下:
#include <stdio.h>
#include <string.h>
#include <wchar.h>
char *ascii_ = "中日友好"; //line-1
wchar_t *wchar_ = L"中日友好"; //line-2
int main()
{
printf("ascii_: %s\n", ascii_); //line-3
wprintf(L"wchar_: %s\n", wchar_); //line-4
return 0;
}
//Output
ascii_: 中日友好
題:
顯然我不應該將CJK字符分配給第1行中的char *指針,但我只是這樣做了,第3行的輸出是正確的,為什么呢? 第3行中的printf()怎么能給我非ascii字符? 它以某種方式知道編碼嗎?
我假設第2行和第4行的代碼是正確的,但為什么我沒有獲得第4行的任何輸出?
首先,在源代碼中使用非ascii字符通常不是一個好主意。 可能發生的是漢字被編碼為UTF-8,與ascii一起使用。
現在,至於為什么wprintf()
不起作用。 這與流方向有關。 每個流只能設置為普通或寬。 設置后,無法更改。 它是在第一次使用時設置的。 (由於printf
,它是ascii)。 之后,由於方向不正確, wprintf
將無法工作。
換句話說,一旦你使用printf()
你需要繼續使用printf()
。 同樣,如果從wprintf()
開始,則需要繼續使用wprintf()
。
你不能混合printf()
和wprintf()
。 (在Windows上除外)
編輯:
回答關於為什么wprintf
線甚至wprintf
工作的問題。 這可能是因為代碼正在編譯中,因此中日友好
的UTF-8格式存儲在wchar_
。 但是, wchar_t
需要4字節的unicode編碼。 (Windows中的2個字節)
所以我可以想到兩個選項:
wchar_t
,只需堅持使用多字節char
。 這是一種簡單的方法,但如果用戶的系統未設置為中文語言環境,則可能會中斷。 wchar_t
,但您需要使用unicode轉義序列對中文字符進行編碼。 這顯然會使它在源代碼中無法讀取,但它可以在任何可以打印中文字符字體而不管語言環境的機器上工作。 第1行不是ascii,它是編譯器在編譯時使用的任何多字節編碼。 在現代系統上,可能是UTF-8。 printf
不知道編碼。 它只是向stdout發送字節,只要編碼匹配,一切都很好。
您應該注意的一個問題是第3行和第4行一起調用未定義的行為。 您不能在同一個FILE
( stdout
)上混合基於字符和寬字符的io。 在第一次操作之后, FILE
具有“方向”(字節或寬),之后,任何執行相反方向操作的嘗試都會產生UB。
你省略了一步,因此想錯了路。
磁盤上有一個C文件,包含字節。 你有一個“ASCII”字符串和一個寬字符串。
ASCII字符串采用與第1行完全相同的字節並輸出它們。 只要用戶方的編碼與程序員方的編碼相同,這就有效。
寬字符串首先將給定的字節解碼為unicode代碼點並存儲在程序中 - 這可能是你的錯誤。 在輸出時,它們根據用戶側的編碼再次編碼。 這可以確保這些字符按照預期的方式發出,而不是輸入它們。
您的編譯器假定編碼錯誤,或者您的輸出終端設置錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.