[問題] GBK轉編碼
各位先進好,
目標字(範例): 蹈桶狟婥
我測了一些方式, 想把這串GBK編碼的文字轉成可識別的中文, 無論是簡或繁。
目前已知
1. .Net中任何String的表示形式 都是Unicode
2. System.text.Encodng class提供一些 API可以轉
3. 轉換時要指定輸入編碼 輸出編碼, 並一律以byte[]形式進行轉換
相關語法
ex. Encoding.getEncoding("編碼").getbytes(string) (轉成byte[])
Encoding.convert(原編碼,目標編碼, 要轉的byte[]) (轉成byte[])
Encoding.getEncoding("編碼").getString(byte[]) (轉成string)
等等...
我做了各種測試 但是找不到正確的用法把GBK文字轉成中文
頂多show出的結果是原來的GBK目標字而不是亂碼。
不曉得原因為何?
如果是.NET不支援GBK, 但我測試過 下面這行
StreamReader(path + ".txt",Encoding.GetEncoding("GBK"));
編碼卻是轉換成功的, 可以正確顯示中文。
請問有人知道怎解嗎? 謝謝。
--
人生 何必
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.118.23.78
※ 文章網址: http://www.ptt.cc/bbs/C_Sharp/M.1402975455.A.3AA.html
→
06/17 15:37, , 1F
06/17 15:37, 1F
→
06/17 15:37, , 2F
06/17 15:37, 2F
→
06/17 15:39, , 3F
06/17 15:39, 3F
推
06/17 17:07, , 4F
06/17 17:07, 4F
→
06/17 17:08, , 5F
06/17 17:08, 5F
→
06/17 17:21, , 6F
06/17 17:21, 6F
→
06/17 17:21, , 7F
06/17 17:21, 7F
抱歉 不是很能理解... 我原不想把語法貼上來 因為可能是錯的
但不貼上來 可能大家也不知道錯在哪 我下面貼一下。
string s = "蹈桶狟婥";
//轉成GBK byte[]
byte[] gbk_byte = Encoding.GetEncoding("gbk").GetBytes(s.ToString());
//轉成UTF8 byte[]
byte[] utf8_byte =
Encoding.Convert(Encoding.GetEncoding("gbk"), Encoding.UTF8, gbk_byte);
//轉成顯示字串
string text = Encoding.UTF8.GetString(utf8_byte);
初步想法是這樣 請問哪邊是該修正的? 謝謝
→
06/17 21:18, , 8F
06/17 21:18, 8F
→
06/17 21:19, , 9F
06/17 21:19, 9F
→
06/17 21:29, , 10F
06/17 21:29, 10F
→
06/17 21:33, , 11F
06/17 21:33, 11F
→
06/17 21:34, , 12F
06/17 21:34, 12F
→
06/17 21:35, , 13F
06/17 21:35, 13F
→
06/17 21:35, , 14F
06/17 21:35, 14F
謝謝回覆 @ @
我想請問 怎麼知道是Big5?? 我想過可能Win7系統Default可能是UTF8之類
卻怎樣也沒想過朝Big5去想 是Compiler的環境? 或者是我抓的目標本身是Big5..
光從字串就可以看出是Big5編的亂碼..
另外所謂的Binary 如果要轉的字串來源
如本篇 String s = ""; 直接就是宣告在程式中了 那做法也是一樣用Big5去解?
其實我看得懂你的意思 簡單說就是我以為的編碼 卻不只是我以為的。
只是不太懂 明明照API的參數去call 我以為是對 但其實卻錯了(?) 冒出個Big5
(然後我一直有想到是否該轉回Unicode 再繼續做進一步的轉換。 就是沒想到Big5)
如果問題簡化一點 純粹就是宣告在程式中的String 只是內容是GBK,
這樣做法會不會不一樣??
拍謝問了這麼多 .. 我再努力做看看 謝謝。
※ 編輯: pkmu8426 (122.118.23.78), 06/17/2014 21:54:48
推
06/17 23:21, , 15F
06/17 23:21, 15F
→
06/18 00:32, , 16F
06/18 00:32, 16F
→
06/18 00:32, , 17F
06/18 00:32, 17F
→
06/18 00:33, , 18F
06/18 00:33, 18F
→
06/18 00:34, , 19F
06/18 00:34, 19F
推
06/18 11:08, , 20F
06/18 11:08, 20F
推
06/18 12:41, , 21F
06/18 12:41, 21F
→
06/18 13:54, , 22F
06/18 13:54, 22F
→
06/18 14:20, , 23F
06/18 14:20, 23F
→
06/18 14:41, , 24F
06/18 14:41, 24F
→
06/18 14:44, , 25F
06/18 14:44, 25F
→
06/18 14:47, , 26F
06/18 14:47, 26F
→
06/18 19:46, , 27F
06/18 19:46, 27F
哈哈 謝謝各位大德回覆 已經解決。
(原來我前幾天曾經看過一篇文後測出的結果 不是錯覺 - -)
也的確是跟轉碼沒關係(這邊是陷入的第二個迷思!!)
幸好 經過這次經驗 我學得更深刻了!
謝謝各位。
我把解法PO在下面
1. 當明確知道最終字串的原始編碼(GBK) 以及最後是被哪種編碼(Big5) decoding
Encoding Big5 = Encoding.GetEncoding("Big5");
Encoding GBK = Encoding.GetEncoding("GBK");
byte[] big5_byte = Big5.GetBytes("原始字串");
string s_result = GBK.GetString(big5_byte);
2. 當不曉得最終字串是被哪種編碼decode 只知道最原始的encoding編碼
byte[] big5_byte = Encoding.Default.GetBytes(s);
string s_result = GBK.GetString(big5_byte);
一般來說 用第二種方法比較省事, 看了一篇文章 Default是照所用OS的編碼語系
當然 兩種方法僅適用經過一層的編、解碼 如果中間還經過許多步驟的邊解碼...
可能必須再靠人工一一測試了。
※ 編輯: pkmu8426 (114.46.222.47), 06/19/2014 00:06:48