c語(yǔ)言printf輸出中文亂碼 c語(yǔ)言輸出亂碼怎么解決?
c語(yǔ)言輸出亂碼怎么解決?1. 如果字符串?dāng)?shù)組中的每個(gè)字符都分配了一個(gè)值,請(qǐng)?jiān)诿總€(gè)字符串的最后一個(gè)字符后添加“0”,以指示字符串的結(jié)尾,輸入時(shí)不會(huì)出現(xiàn)不必要的亂碼,因?yàn)間ets()或scanf()的%s
c語(yǔ)言輸出亂碼怎么解決?
1. 如果字符串?dāng)?shù)組中的每個(gè)字符都分配了一個(gè)值,請(qǐng)?jiān)诿總€(gè)字符串的最后一個(gè)字符后添加“0”,以指示字符串的結(jié)尾,輸入時(shí)不會(huì)出現(xiàn)不必要的亂碼,因?yàn)間ets()或scanf()的%s會(huì)在字符串結(jié)尾后主動(dòng)添加“0”。
C語(yǔ)言控制臺(tái)程序,中文輸出變成亂碼,怎么解決?
這涉及到源代碼(文本)、編譯的二進(jìn)制文件和最終控制臺(tái)輸出編碼形式中字符的差異。
首先,請(qǐng)明確C(語(yǔ)言/程序)不理解ANSI、UTF-8和任何其他編碼。它只知道如何在簡(jiǎn)體中文窗口中處理您,默認(rèn)的文本保存代碼是ANSI(GBK)。在Linux中,根據(jù)系統(tǒng)區(qū)域設(shè)置,它應(yīng)該是(zh)中國(guó)聯(lián)合技術(shù)論壇-8) (以下基于簡(jiǎn)體中文窗口)
1)對(duì)于源文件中保存的字符串“Chinese”,VS2008將看到“0xd6d0”和“0xcec4”(默認(rèn)ANSI編碼)的形式。但是,編譯器并不關(guān)心它是否是GBK Shenma,它關(guān)心的是數(shù)字字符串。區(qū)別在于MinGW看到“0xe4b8ad”和“0xe69687”(GCC默認(rèn)UTF-8)。注意,用MinGW編譯的源代碼文件中有全中文字符,必須保存為UTF-8編碼。
2)然后,在二進(jìn)制文件存儲(chǔ)形式中,對(duì)于傳統(tǒng)字符串(char STR[]=“Chinese”),編譯器不做任何操作,直接移動(dòng)數(shù)字字符串(如“0xd6d0”,但是對(duì)于寬字符串(wchar)ut wstr[]=例如,“Chinese”的16位Unicode是“0x4e2d”和“0x6587”,然后轉(zhuǎn)換的數(shù)字(“0x4e2d”,“0x6587”)被放入二進(jìn)制文件。(這里的vs和MinGW沒(méi)有區(qū)別)
]這里,需要注意的是,編譯器必須知道,例如,vs在默認(rèn)情況下是ANSI代碼。如果使用UTF-8保存。用VS打開(kāi)的C源文件,必須是亂碼。同樣,如果使用MinGW編譯用ANSI代碼保存的源文件,也會(huì)出現(xiàn)錯(cuò)誤!(但您可以修改編譯選項(xiàng),請(qǐng)參閱本文結(jié)尾)在本文中,這個(gè)原因非常容易理解,因?yàn)榫幾g器需要知道將保存在文件中的字符轉(zhuǎn)換為寬字符時(shí)使用的編碼。(可以看出,上面的vs是GBK->unicode,MinGW是UTF-8->unicode。)