google-code-prettify

星期五, 4月 15, 2011

【Oracle】Oracle characterset US7ASCII 亂碼求生之道

環境說明:
Oracle NLS_LANG 為 "TRADITIONAL CHINESE_TAIWAN.US7ASCII"
( 之前的開發人員把DB設成 US7ASCII,Client 設成 ZHT16MSWIN950,)


Oracle的 server characterset 為 US7ASCII 時 存到 DB 中的 中文字
是以BIG5 編碼 被存入 到VARCHAR欄位中

當 DotNET 從 DB取出後,卻變成亂碼
檢查編碼 : select columns, UTL_RAW.cast_to_raw(columns) from table

columns UTL_RAW.cast_to_raw(columns)
--------------------------------------------------------------------------------------
成功路200號 A6A8A55CB8F4A2B1A2AFA2AFB8B9

利用中文編碼解析工具 1.32 來解析
UTL_RAW.cast_to_raw(columns) 轉出來的編碼是 BIG5

好吧~進入主題 開始亂搞吧
select UTL_RAW.cast_to_nvarchar2(UTL_RAW.CONVERT(UTL_RAW.cast_to_raw(columns),'TRADITIONAL CHINESE_TAIWAN.AL16UTF16','TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950')) as DD from table
把資料庫中的編碼當成 TRADITIONAL.CHINESE_TAIWAN.ZHT16MSWIN950
然後把它(這畜牲)轉成 TRADITIONALCHINESE_TAIWAN.AL16UTF16

好了從SQLPLUS查出來是 ??????? 看來很正常

Dim DS As DataSet, DS1 As DataSet
Dim sss As String = "select UTL_RAW.cast_to_nvarchar2(UTL_RAW.CONVERT(UTL_RAW.cast_to_raw(columns),'TRADITIONALCHINESE_TAIWAN.AL16UTF16','TRADITIONAL.CHINESE_TAIWAN.ZHT16MSWIN950')) as DD from table"

DS1 = CreateDataset(sss, "aa")  'CreateDataset 函數自己寫的
Dim DD As String = DS1.Tables(0).Rows(0).Item(0)
Dim bb() As Byte
bb = Encoding.Unicode.GetBytes(DS1.Tables(0).Rows(0).Item(0))

Response.Write(DD + " " + BitConverter.ToString(bb) + "
")

從網頁上查出來果然正常了
成功路200號 10-62-9F-52-EF-8D-12-FF-10-FF-10-FF-5F-86

利用中文編碼解析工具 1.32 來解析 10-62-9F-52-EF-8D-12-FF-10-FF-10-FF-5F-86 為 UTF16編碼

使用函數:
1. UTL_RAW.cast_to_nvarchar2
2. UTL_RAW.CONVERT
3. UTL_RAW.cast_to_raw

PS:不知道其他適不適用...

參考Link:
Oracle UTL_RAW
Oracle UTL_RAW Package
.Convert string to and back: UTF8,UTF7,Unicode and UTF32
KB-Oracle 9i NVarchar求生守則 (黑暗執行緒)

沒有留言 :

張貼留言