為什麼這篇big 5轉換鄉民發文收入到精華區:因為在big 5轉換這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者darkk6 (Mr. Pan)看板java標題Re: [問題] big5轉utf8時間Wed ...
※ 引述《del680202 (HANA)》之銘言:
: 有試著爬過文,但是沒找到解法
: 最近要做資料傳遞
: 但是問題是server端是utf-8的編碼環境
: 而client是big5的編碼環境
: 現在策略是client端統一把資料轉utf-8文字傳過去
: 我試著估狗,但是找到的答案都是用getBytes方式去轉
: 可是我實際測試了儘管用getBytes去拿到utf-8文字
: 他也只是假性當作utf-8,骨子裡還是big5文字
錯~ 骨子裡是一連串的 bytes 資料
傳送資料的時候都是用 byte , 所以無論如何請將資料以 byte 來看待
我們知道文字的編碼是一種規範(參考高中資訊課程第二章)
變成版標了 \OwO/ , 重新翻了一下課本應該是第一章啦 XD
大家耳熟能詳的就是 Big-5 UTF-8 Unicode GB...
資料要傳出去的時候是以 byte 進行傳送, 也就是根據文字的編碼決定
"轉成哪些 bytes" , 參考 http://ideone.com/PelQG4
範例中可以看到 "哈" 這個字的 Big-5 編碼是 AB A2 , UTF-8 為 E5 93 88
系統預設和 UTF-8 相同就表示這個系統的預設編碼是 UTF-8
PS : 系統指的是 OS , 作業系統,並非 Java
假設一個文字檔只有一個字 "哈" , 並且是以 Big-5 編碼儲存,就表示
其 Binary 內容是 AB A2 , 那麼,在不只定 Reader (或 InputStream)
讀取文字編碼的狀況下,使用系統預設(這邊假設是 UTF-8) , 會得到甚麼結果呢 ?
就會像這樣: http://ideone.com/wweTqe , 目前還不用去管在程式
裡面他用甚麼方式取儲存。
記住,資料傳輸都用 Bytes , 因此在讀取資料的時候,要根據你取得什麼樣子的
Bytes 去調整用甚麼方式來解釋他、 "看待" 他
至於送出的時候(我記得原PO是在做 socket ?),也要指定輸出的格式
一個字串 "哈" 儲存在程式裡面,現在要送出去的時候一樣需要轉換成 bytes
但這邊就遇到了編碼問題,要轉換成那些 bytes 送出?
是 AB A2 還是 E5 93 88 ? 這就是在決定 getBytes("這裡") 要採用何種編碼。
如果我 Server 將文字以 Big-5 編碼送出,那麼就會送出 AB A2 兩個 bytes
Client 把收到的資料指定用 Big-5 來 "看待" 的話,就可以正常地取出 "哈"
這個字了。
至於何謂 Java 裡面使用 Unicode ? 這就是上面我說目前不用去管的部分。
先看範例 : http://ideone.com/RjzhvU
從此例子中可以看到 "哈" 在 Unicode 裡面是 54 C8
※ FE FF 稱為 BOM , 和文字本身無關,參考 http://ppt.cc/7KiZ
接著我們各自使用正確的編碼建立 Big5 和 UTF8 的文字,利用
codePointAt 取得文字的編碼(16 進位),可以發現無論是從 Big5 或者 UTF-8
編碼而來的文字,到 java 裡面都是 Unicode 的方式儲存
http://ideone.com/RwF0c8
"哈" = 0x54C8
Client 儲存
=> 轉換後準備送出
-- Socket 傳送 -->
收到準備轉換 =>
Server 儲存
(指定 Big5)
54C8 => ABA2 ---- Socket 傳送 ----> ABA2 => 54C8
(指定 UTF-8)
54C8 => E59288 ---- Socket 傳送 ----> E59288 => 54C8
結論:
簡單來說請記得資料再傳送和讀寫,都以 Bytes 去想
話說有人提到 javac -encoding 的樣子 ?
這個 encoding 是指你的 Souce Code ( .java )是什麼編碼的文字檔
和執行時的編碼完全無關
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.60.161.229
※ 文章網址: http://www.ptt.cc/bbs/java/M.1395812048.A.BFB.html
※ 編輯: darkk6 來自: 210.60.161.229 (03/26 16:28)
※ 編輯: darkk6 來自: 210.60.161.229 (03/26 16:31)