我姓許,最近在學寫c語言,無意間發現到只要程式執行時有打印出我的名字的部分,印出來的結果都會變成奇怪的三個字,之後我還試了一些其他姓許的人的名字,也是一樣會出現怪怪的字,但是其他姓氏的就不會。
還有以前別人用yahoo寄信給我的時候也是這樣,我名字的部分總是會被改成”釦蚨a”這三個字。
只是覺得有點納悶,所以來這邊發問,希望知道的人能幫忙解惑~
2006-09-06 16:48:18 · 3 個解答 · 發問者 ? 1 in 電腦與網際網路 ➔ 程式設計
並不是「許」對電腦而言有特殊的意義應該說「許」對某一些語法剖析器、正規表示法剖析器有特殊解釋法主要的原因是,中文字使用兩個byte,而許多語言解釋器還是一個byte一個byte處理,所以像中文這種雙位元組的文字實際上是被肢解開來處理。許這個字的其中一個byte就是 '\'字元,如果你學過C語言應該會曉得 '\'字元會和接下來的字元合成一個escape sequence,例如\n、\t、\0、\r等等所以你可以在程式中試試看printf("歡迎許n先生");結果很可能會輸出歡迎?先生因為編譯器會將「許」當中的 '\'和緊接在後的 'n'合在一起解釋成 '\n',所以編譯後就替換成換行字元。但假如你將"歡迎許n先生"放在檔案裡,然後用fread讀進來再顯示到螢幕上,就完全沒有任何問題,因為這個過程根本不會經過C語言的語法剖析程序解決的方法之一是主動在特殊字的後面補'\',因為'\\'編譯後會被代換成單一個'\'。和在C裡面寫路徑 "C:\WINDOWS\" 要改成 "C:\\WINDOWS\\"是同樣的道理所以printf("歡迎許\先生");就會顯示為歡迎許先生但我必須說這是一個爛方法,因為不同的環境可能會採用high endian、little endian不同的位元組順序,所以有時候要補前面,有時候要補後面,不利於程式維護。「許」這類的例子只發生在C的規則中,不幸的是很多環境都模仿C的規則,所以常常看得到這個問題。若是對其他的語法解釋器來說,\符號可能是完全正常的,但是變成其他符號有問題。例如html解釋器當中'<'、'>'符號就很麻煩,所以在許多讓人po文章的網站都要仔細處理,但是處理不好的例子也很常見(知識+ 的初學者回答問題時#include <>常常被吃掉就是一個好例子)。還好big5沒有衝到'<'、'>'符號,不然問題更棘手總結原因1.許多環境仍然以byte為處理文字的單位來對付中文。解決方法:程式換用寬字元或UTF-82.big5編碼的時候沒有刻意避開'\'。解決方法:不要使用big5如果你有興趣多了解,可以參考拙作http://www.wretch.cc/blog/novus&article_id=3481397http://www.wretch.cc/blog/novus&article_id=3481412(尚未完成,錯誤難免,還請各方賢達不吝斧正)
2006-09-06 21:01:15 · answer #1 · answered by novus 6 · 0⤊ 0⤋
一個英文字佔 1個位元組
一個中文字佔 2個位元組
讀取中文字串,為了避免亂碼,必須一次讀取一個陣列元素,並且讀取兩個陣列元素來組合一個中文字。
2006-09-06 17:18:32 · answer #2 · answered by Big_John-tw 7 · 0⤊ 0⤋
Big5 許功蓋的ASCII 分別為 許=B35C 功=A55C 蓋=BB5C 而'\'這個字元的內碼為5C
而在C語言中,中文字尾碼為5C('\')的字在mysql為escape character所以就會被忽略,所以許功蓋三個字存入mysql時就變成B3A5B8,再讀出來時就成了亂碼
還有以下字也有相同的問題..
么 功 吒 吭 沔 坼 歿 俞 枯 苒 娉 珮 豹 崤 淚 許 廄
琵 跚 愧 稞 鈾 暝 蓋 墦 穀 閱 璞 餐 縷 擺 黠 孀 髏 躡
尐 佢 汻 岤 狖 垥 柦 胐 娖 涂 罡 偅 惝 牾 莍 傜 揊 焮 茻 鄃
幋 滜 綅 赨 塿 槙 箤 踊 嫹 潿 蔌 醆 嬞 獦 螏 餤 燡 螰 駹 礒
鎪 瀙 酀 瀵 騱 酅 贕 鱋 鱭.......
其實不僅是C語言,LINUX底下,還有很多網頁也都會有這種情形
2006-09-06 16:59:28 · answer #3 · answered by ? 3 · 0⤊ 0⤋