Re: [問題] Big5 轉 UTF-8

看板C_Sharp作者 (靖)時間9年前 (2015/06/19 21:54), 編輯推噓0(003)
留言3則, 2人參與, 最新討論串5/5 (看更多)
※ 引述《FT6034 (耐心等待)》之銘言: : 事情是這樣發展的... : 主程式是外國人針對某遊戲寫的,透過API取得聊天室訊息 : 原程式儲存資訊至 txt 檔,編碼是 UTF-8 : 輸入 "測試" , txt 檔裡頭記錄 "皜祈岫" ,所以我猜測 args.Message 是 BIG5 問題很簡單 原來的程式沒有問題 是因為那個txt沒有BOM所以記事本把檔案當作Big5讀取 現在你有兩種做法 1. 檔頭加上BOM 其他程式碼不變 通通不要帶編碼 這樣.NET預設使用UTF-8寫入檔案 var stream = new StreamWriter(_path, true); var stream = new StreamWriter(_path, true, Encoding.UTF8); 這兩行是一樣的 2. 指定使用Big5輸出 var stream = new StreamWriter(_path, true, Encoding.GetEncoding(950)); 這樣該檔案可以使用記事本正常讀取 ---- 對於英文 使用ANSI與UTF-8出來的檔案是一樣的 UTF-8就是一個英語系用很爽 其他語系跳火圈的編碼 http://www.csie.ntu.edu.tw/~p92005/Joel/Unicode.html --- Game.OnChat內部是使用指標直接讀取記憶體 並且沒有指定編碼 預設使用ANSI讀 類似這樣 new string((sbyte*)message) 而讀取出來 你在Visual Studio 下中斷點看到args.Message如果是正常的 表示已經正常讀取並轉換成UTF-16放在記憶體內 https://msdn.microsoft.com/zh-tw/library/cc488003.aspx "在 C# 中,所有記憶體內的字串編碼都是 Unicode (UTF-16)。 當您將資料從儲存區帶入 string 物件時,資料會自動轉換成 UTF-16。 如果資料只包含 0 到 127 的 ASCII 值,您就不需要額外進行轉換。 不過,如果原始程式文字包含延伸 ASCII 位元組值 (128 到 255),則預設會按照目前 的字碼頁 (Code Page) 來解譯擴充字元。" 因為你的程式在中文Windows上跑 基本上這段不會有問題 剩下的問題就是這UTF-16怎麼輸出的問題了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.169.198.62 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1434722062.A.361.html

06/20 09:36, , 1F
謝謝指教,「UTF-16怎麼輸出」我再研究看看@@"
06/20 09:36, 1F

06/20 11:23, , 2F
不要管UTF-16 那不是你該管的 你要做的是用最一開始會亂
06/20 11:23, 2F

06/20 11:24, , 3F
碼的原始碼 加上第二種解法就行了
06/20 11:24, 3F
文章代碼(AID): #1LX1yEDX (C_Sharp)
文章代碼(AID): #1LX1yEDX (C_Sharp)